more robust implementation for BOOST_RANGE_EXTRACT_OPTIONAL_TYPE

This commit is contained in:
Eric Niebler
2014-06-16 00:00:09 -07:00
parent 5ce6dc7814
commit 264017e2a9

View File

@ -15,36 +15,32 @@
#endif #endif
#include <boost/config.hpp> #include <boost/config.hpp>
#include <boost/preprocessor/cat.hpp>
#include <boost/mpl/has_xxx.hpp>
#ifdef BOOST_NO_PARTIAL_SPECIALIZATION_IMPLICIT_DEFAULT_ARGS #if !defined(BOOST_MPL_CFG_NO_HAS_XXX)
#define BOOST_RANGE_EXTRACT_OPTIONAL_TYPE( a_typedef ) \
template< typename C > \
struct extract_ ## a_typedef \
{ \
typedef BOOST_DEDUCED_TYPENAME C::a_typedef type; \
};
#else
namespace boost {
namespace range_detail {
template< typename T > struct exists { typedef void type; };
}
}
// Defines extract_some_typedef<T> which exposes T::some_typedef as // Defines extract_some_typedef<T> which exposes T::some_typedef as
// extract_some_typedef<T>::type if T::some_typedef exists. Otherwise // extract_some_typedef<T>::type if T::some_typedef exists. Otherwise
// extract_some_typedef<T> is empty. // extract_some_typedef<T> is empty.
#define BOOST_RANGE_EXTRACT_OPTIONAL_TYPE( a_typedef ) \ #define BOOST_RANGE_EXTRACT_OPTIONAL_TYPE( a_typedef ) \
template< typename C, typename Enable=void > \ BOOST_MPL_HAS_XXX_TRAIT_DEF(a_typedef) \
struct extract_ ## a_typedef \ template< typename C, bool B = BOOST_PP_CAT(has_, a_typedef)<C>::value > \
{}; \ struct BOOST_PP_CAT(extract_, a_typedef) \
template< typename C > \ {}; \
struct extract_ ## a_typedef< C \ template< typename C > \
, BOOST_DEDUCED_TYPENAME boost::range_detail::exists< BOOST_DEDUCED_TYPENAME C::a_typedef >::type \ struct BOOST_PP_CAT(extract_, a_typedef)< C, true > \
> { \ { \
typedef BOOST_DEDUCED_TYPENAME C::a_typedef type; \ typedef BOOST_DEDUCED_TYPENAME C::a_typedef type; \
};
#else
#define BOOST_RANGE_EXTRACT_OPTIONAL_TYPE( a_typedef ) \
template< typename C > \
struct BOOST_PP_CAT(extract_, a_typedef) \
{ \
typedef BOOST_DEDUCED_TYPENAME C::a_typedef type; \
}; };
#endif #endif