Макро TTI BOOST_TTI_HAS_STATIC_MEMBER_FUNCTION
интроспектирует статическую функцию члена класса.
BOOST_TTI_HAS_STATIC_MEMBER_FUNCTION принимает один параметр, который является названием внутренней статической функции члена, существование которого программист хочет проверить. Макро генерирует метафункцию 'has_static_member_ function_name_of_inner_static_member_ function'.
На метафункцию можно ссылаться двумя разными способами.
Первый способ состоит в том, чтобы передать его тип блокировки для интроспектирования и подпись для функции статического члена как отдельные аргументы шаблона. Сигнатура для функции статического члена состоит из типа возврата, факультативных типов параметров в виде импульса::mpl передняя последовательность типов, а также опционального типа тега Boost FunctionTypes. Типичный импульс::mpl передняя последовательность типов - это повышение::mpl::vector<>.
Второй способ состоит в том, чтобы передать его тип блокировки для интроспектирования и подпись для функции статического члена как функции. Функция имеет форму:
Return_Type ( Parameter_Types )
где Параметр_ Типы могут быть пустыми или смешанным списком типов параметров, если существует более одного типа параметров.
Метафункция возвращает один тип, называемый «типом», который является импульсом::mpl::bool_. В качестве удобства метафункция возвращает значение этого типа непосредственно в виде константы bool времени компиляции, называемой "значение". Это верно или неверно в зависимости от того, существует или нет внутренняя статическая функция члена указанной подписи.
Вы генерируете метафункцию, ссылаясь на макрос с именем функции внутреннего статического элемента:
BOOST_TTI_HAS_STATIC_MEMBER_FUNCTION(AStaticMemberFunction)
генерирует метафункцию, называемую 'has_static_member_ function_AStaticMemberFunction' в текущей области.
Вы вызываете метафункцию, обобщая шаблон с типом вложения, чтобы интроспектировать и подпись функции статического элемента как ряд параметров шаблона. В качестве альтернативы вы можете вызвать метафункцию, передав ей тип вложения и подпись функции статического члена как один тип функции.
Значение возврата, называемое «значением», является константой компиляции времени дурака.
has_static_member_function_AStaticMemberFunction
<
Enclosing_Type,
StaticMemberFunction_ReturnType,
boost::mpl::vector<StaticMemberFunction_ParameterTypes>,
boost::function_types::SomeTagType
>::value
OR
has_static_member_function_AStaticMemberFunction
<
Enclosing_Type,
Return_Type ( Parameter_Types )
>::value
Сначала мы создаем метафункции для различных внутренних статических названий функций-членов:
#include <boost/tti/has_static_member_function.hpp>
BOOST_TTI_HAS_STATIC_MEMBER_FUNCTION(function1)
BOOST_TTI_HAS_STATIC_MEMBER_FUNCTION(function2)
BOOST_TTI_HAS_STATIC_MEMBER_FUNCTION(function3)
Далее давайте создадим определенные пользователем типы, которые мы хотим интроспектировать.
struct AClass { };
struct Top
{
static int function1();
static AClass function2(double,short *);
};
struct Top2
{
static long function2(Top &,int,bool,short,float);
static Top * function3(long,int,AClass &);
};
Наконец мы ссылаемся на нашу метафункцию и возвращаем нашу ценность. Все это происходит во время компиляции и может быть использовано программистами, выполняющими метапрограммирование шаблонов времени компиляции.
Мы покажем обе формы в следующих примерах. Обе формы полностью взаимозаменяемы по желаемому результату.
has_static_member_function_function1<Top,int>::value;
has_static_member_function_function1<Top,int ()>::value;
has_static_member_function_function1<Top2,int>::value;
has_static_member_function_function2<Top,AClass,boost::mpl::vector<double,short *> >::value;
has_static_member_function_function2<Top2,AClass,boost::mpl::vector<double,short *> >::value;
has_static_member_function_function2<Top2,long (Top &,int,bool,short,float)>::value;
has_static_member_function_function3<Top2,int ()>::value;
has_static_member_function_function3<Top2,Top * (long,int,AClass &)>::value;
Макрокодирует только название функции статического члена, для которой мы ищем, и тот факт, что мы интроспектируем функцию статического члена в типе обложки.
Из-за этого, как только мы создаем нашу метафункцию для проверки функции статического члена по имени, мы можем повторно использовать метафункцию для интроспектирования любого типа, имеющего любую функцию статического члена, для этого имени.