Использование макро метафункций может быть проиллюстрировано сначала созданием некоторого гипотетического типа пользователя с соответствующими вложенными типами и другими внутренними элементами. С этим типом мы можем проиллюстрировать использование макро-метафункций. Это просто должно служить моделью для того, что тип T может повлечь за собой из класса или шаблона функции, где «T» - это тип, переданный шаблону.
struct AType
{
typedef int AnIntType;
struct BType
{
struct CType
{
};
};
template <class> struct AMemberTemplate { };
template <class,class,class> struct AnotherMemberTemplate { };
template <class,class,int,class,template <class> class,class,long> struct ManyParameters { };
template <class,class,int,short,class,template <class,int> class,class> struct MoreParameters { };
BType IntBT;
int IntFunction(short) { return 0; }
static short DSMember;
static int SIntFunction(long,double) { return 2; }
};
Я буду использовать тип выше, чтобы проиллюстрировать тип вопросов метапрограммирования, которые мы можем задать для какого-то типа T, который передается программисту шаблона в шаблоне класса. Вот как может выглядеть шаблон класса:
#include <boost/tti/tti.hpp>
template<class T>
struct OurTemplateClass
{
};
Теперь давайте создадим и созовем макро-метафуны для каждого из наших типов внутренних элементов, чтобы увидеть, соответствует ли тип T выше нашему гипотетическому типу выше. Представьте, что это находится в пределах 'Наш шаблон класса' выше. В приведенных ниже примерах один и тот же макрос используется только один раз, чтобы избежать нарушений УСО.
Имеет У T есть вложенный тип, называемый "AnIntType"?
BOOST_TTI_HAS_TYPE(AnIntType)
has_type_AnIntType
<
T
>
Имеет У T есть вложенный тип, называемый 'BType'?
BOOST_TTI_HAS_TYPE(BType)
has_type_BType
<
T
>
Имеет У T есть вложенный тип, называемый «AnIntType», тип которого является «int»?
#include <boost/mpl/placeholders.hpp
#include <boost/type_traits/is_same.hpp
using namespace boost::mpl::placeholders;
has_type_AnIntType
<
T,
boost::is_same<_1,int>
>
Имеет T имеет вложенный шаблон класса под названием "AMemberTemplate", параметры которого являются всеми типами ('class' или 'typename'?
BOOST_TTI_HAS_TEMPLATE(AMemberTemplate,BOOST_PP_NIL)
has_template_AMemberTemplate
<
T
>
Имеет T имеет вложенный шаблон класса под названием "AMemberTemplate", параметры которого являются всеми типами ('class' или 'typename'?
BOOST_TTI_HAS_TEMPLATE(AnotherMemberTemplate)
has_template_AnotherMemberTemplate
<
T
>
Имеет T имеет вложенный шаблон класса под названием «MoreParameters», параметры которого точно указаны?
BOOST_TTI_HAS_TEMPLATE(MoreParameters,(8,(class,class,int,short,class,template <class,int> class,class)))
has_template_MoreParameters
<
T
>
Имеет T имеет вложенный шаблон класса под названием «ManyParameters», параметры которого точно указаны?
BOOST_TTI_HAS_TEMPLATE(ManyParameters,class,class,int,class,template <class> class,class,long)
has_template_ManyParameters
<
T
>
Имеет У T есть данные-члены, называемые 'IntBT', тип которых 'AType::BType'?
BOOST_TTI_HAS_MEMBER_DATA(IntBT)
has_member_data_IntBT
<
T,
AType::BType
>
Имеет У T есть данные-члены, называемые 'IntBT', тип которых 'AType::BType'?
BOOST_TTI_HAS_MEMBER_DATA(IntBT)
has_member_data_IntBT
<
AType::BType T::*
>
Имеет T имеет функцию члена, называемую 'IntFunction', чей тип 'int (короткометражный)?
BOOST_TTI_HAS_MEMBER_FUNCTION(IntFunction)
has_member_function_IntFunction
<
T,
int,
boost::mpl::vector<short>
>
Имеет T имеет функцию члена, называемую 'IntFunction', чей тип 'int (короткометражный)?
BOOST_TTI_HAS_MEMBER_FUNCTION(IntFunction)
has_member_function_IntFunction
<
int (T::*)(short)
>
Имеет У T есть статические данные участника, называемые 'DSMember', чей тип «короткий»?
BOOST_TTI_HAS_STATIC_MEMBER_DATA(DSMember)
has_static_member_data_DSMember
<
T,
short
>
Имеет T имеет статическую функцию члена, называемую 'SIntFunction', чей тип 'int (длинный, двойной)?
BOOST_TTI_HAS_STATIC_MEMBER_FUNCTION(SIntFunction)
has_static_member_function_SIntFunction
<
T,
int,
boost::mpl::vector<long,double>
>
Имеет T имеет статическую функцию члена, называемую 'SIntFunction', чей тип 'int (длинный, двойной)?
BOOST_TTI_HAS_STATIC_MEMBER_FUNCTION(SIntFunction)
has_static_member_function_SIntFunction
<
T,
int (long,double)
>
Имеет У T есть данные-член или статические данные-члены, называемые DSMember, чей тип «короткий»?
BOOST_TTI_HAS_DATA(DSMember)
has_static_member_data_DSMember
<
T,
short
>
Имеет T имеет функцию члена или статическую функцию члена, называемую "IntFunction", чей тип "int (короткометражный)"?
BOOST_TTI_HAS_FUNCTION(IntFunction)
has_function_IntFunction
<
T,
int,
boost::mpl::vector<short>
>
Создание вложенного типа T::BType::CType без создания ошибки компилятора, если T не имеет вложенного типа BType::CType?
BOOST_TTI_MEMBER_TYPE(BType)
BOOST_TTI_MEMBER_TYPE(CType)
typename
member_type_CType
<
typename
member_type_BType
<
T
>::type
>::type
Является ли вложенный тип T::BType::CType, созданный без создания ошибки компилятора, если T не имеет вложенного типа BType:: CType, на самом деле существует?
BOOST_TTI_MEMBER_TYPE(BType)
BOOST_TTI_MEMBER_TYPE(CType)
typedef typename
member_type_CType
<
typename
member_type_BType
<
T
>::type
>::type
AType;
boost::tti::valid_member_type
<
AType
>