From de43345b346af9fa6c42707fbdea00d1e3a5ed4d Mon Sep 17 00:00:00 2001 From: Damien Buhl alias daminetreg Date: Sun, 25 Jan 2015 23:05:42 +0100 Subject: [PATCH] BUGFIX: Forwarding template parameters for MSVC to deduced_attr_type context thanks to BOOST_FUSION_ADAPT_STRUCT_MSVC_REDEFINE_TEMPLATE_PARAMS. --- .../fusion/adapted/adt/detail/adapt_base.hpp | 29 +++++++++++++------ 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/include/boost/fusion/adapted/adt/detail/adapt_base.hpp b/include/boost/fusion/adapted/adt/detail/adapt_base.hpp index ff514c7f..49751d0b 100644 --- a/include/boost/fusion/adapted/adt/detail/adapt_base.hpp +++ b/include/boost/fusion/adapted/adt/detail/adapt_base.hpp @@ -44,26 +44,37 @@ BOOST_PP_TUPLE_ELEM(ATTRIBUTE_TUPEL_SIZE, \ BOOST_PP_IF(DEDUCE_TYPE, 1, 3), ATTRIBUTE) +#define BOOST_FUSION_IS_TPL(TEMPLATE_PARAMS_SEQ) \ + BOOST_PP_SEQ_HEAD(TEMPLATE_PARAMS_SEQ) + #define BOOST_FUSION_ADT_ATTRIBUTE_TYPEOF( \ - NAME_SEQ, ATTRIBUTE, ATTRIBUTE_TUPEL_SIZE, PREFIX, IS_TPL) \ + NAME_SEQ, ATTRIBUTE, ATTRIBUTE_TUPEL_SIZE, PREFIX, TEMPLATE_PARAMS_SEQ) \ + \ + BOOST_FUSION_ADAPT_STRUCT_MSVC_REDEFINE_TEMPLATE_PARAMS( \ + TEMPLATE_PARAMS_SEQ) \ \ struct deduced_attr_type { \ static const BOOST_FUSION_ADAPT_STRUCT_UNPACK_NAME(NAME_SEQ)& obj; \ - typedef BOOST_TYPEOF( \ + typedef BOOST_PP_IF(BOOST_FUSION_IS_TPL(TEMPLATE_PARAMS_SEQ), typename, ) \ + BOOST_TYPEOF( \ PREFIX() BOOST_FUSION_ADAPT_ADT_ATTRIBUTE_GETEXPR( \ ATTRIBUTE, ATTRIBUTE_TUPEL_SIZE, 1)) type; \ }; \ \ - typedef BOOST_PP_IF(IS_TPL, typename, ) boost::remove_const< \ - BOOST_PP_IF(IS_TPL, typename, ) deduced_attr_type::type \ - >::type type; \ + typedef BOOST_PP_IF(BOOST_FUSION_IS_TPL(TEMPLATE_PARAMS_SEQ), typename, ) \ + boost::remove_const< \ + BOOST_PP_IF(BOOST_FUSION_IS_TPL(TEMPLATE_PARAMS_SEQ), typename, ) \ + deduced_attr_type::type \ + >::type type; \ \ - typedef BOOST_PP_IF(IS_TPL, typename, ) boost::add_const< \ - BOOST_PP_IF(IS_TPL, typename, ) deduced_attr_type::type \ + typedef BOOST_PP_IF(BOOST_FUSION_IS_TPL(TEMPLATE_PARAMS_SEQ), typename, ) \ + boost::add_const< \ + BOOST_PP_IF(BOOST_FUSION_IS_TPL(TEMPLATE_PARAMS_SEQ), typename, ) \ + deduced_attr_type::type \ >::type const_type; #define BOOST_FUSION_ADT_ATTRIBUTE_GIVENTYPE( \ - NAME_SEQ, ATTRIBUTE, ATTRIBUTE_TUPEL_SIZE, PREFIX, IS_TPL) \ + NAME_SEQ, ATTRIBUTE, ATTRIBUTE_TUPEL_SIZE, PREFIX, TEMPLATE_PARAMS_SEQ) \ \ typedef BOOST_PP_TUPLE_ELEM(ATTRIBUTE_TUPEL_SIZE, 0, ATTRIBUTE) type; \ typedef BOOST_PP_TUPLE_ELEM(ATTRIBUTE_TUPEL_SIZE, 1, ATTRIBUTE) const_type; @@ -89,7 +100,7 @@ ATTRIBUTE, \ ATTRIBUTE_TUPEL_SIZE, \ PREFIX, \ - BOOST_PP_SEQ_HEAD(TEMPLATE_PARAMS_SEQ)) \ + TEMPLATE_PARAMS_SEQ) \ \ template \ BOOST_FUSION_GPU_ENABLED \