Макро TTI BOOST_TTI_HAS_FUNCTION
интроспектирует внутреннюю функцию класса. Функция может быть либо функцией члена, либо статической функцией члена.
BOOST_TTI_HAS_FUNCTION Он берет один параметр, который называется внутренней функцией, существование которой программист хочет проверить. Макро генерирует метафункцию, называемую «has_function_»name_of_inner_function.
Метафункция может быть вызвана путем передачи ей прилагающего типа для интроспекции и подписи для функции в качестве отдельных аргументов шаблона. Подпись для функции состоит из типа возврата, факультативных типов параметров в виде бустера::mpl передней последовательности типов и факультативного типа тега Boost FunctionTypes. Типичным повышением::mpl передней последовательности типов является повышение::mpl::vector<>.
Метафункция возвращает один тип, называемый «тип», который является импульсом::mpl::bool_. В качестве удобства метафункция возвращает значение этого типа непосредственно в виде константы времени компиляции, называемой «значением». Это истинно или ложно в зависимости от того, существует или нет внутренняя функция указанной подписи.
Вы генерируете метафункцию, вызывая макрос с именем внутренней функции:
BOOST_TTI_HAS_FUNCTION(AnInnerFunction)
генерирует метафункцию под названием «has_function_AnInnerFunction» в текущем объеме.
Вы вызываете метафункцию, инстанцируя шаблон с закрытым типом для самоанализа и подписи функции в виде ряда параметров шаблона.
Обратное значение, называемое «значением», представляет собой константу компиляции времени.
has_function_AnInnerFunction
<
Enclosing_Type,
Function_ReturnType,
boost::mpl::vector<Function_ParameterTypes>,
boost::function_types::SomeTagType
>::value
Сначала мы генерируем метафункции для различных названий внутренних функций:
#include <boost/tti/has_function.hpp>
BOOST_TTI_HAS_FUNCTION(function1)
BOOST_TTI_HAS_FUNCTION(function2)
BOOST_TTI_HAS_FUNCTION(function3)
Давайте создадим некоторые пользовательские типы, которые мы хотим интроспектировать.
struct AClass { };
struct Top
{
static int function1();
AClass function2(double,short *);
};
struct Top2
{
long function2(Top &,int,bool,short,float);
static Top * function3(long,int,AClass &);
};
Наконец, мы прибегаем к нашей метафункции и возвращаем нашу ценность. Все это происходит во время компиляции и может быть использовано программистами, выполняющими компиляцию метапрограммирования шаблона времени.
has_function_function1<Top,int>::value;
has_function_function1<Top2,int>::value;
has_function_function2<Top,AClass,boost::mpl::vector<double,short *> >::value;
has_function_function2<Top2,AClass,boost::mpl::vector<double,short *> >::value;
has_function_function3<Top2,int>::value;
has_function_function3<Top2,Top *,boost::mpl::vector<long,int,AClass &> >::value;
Макрокодирует только название функции, для которой мы ищем, и тот факт, что мы ищем функцию в замкнутом типе.
Из-за этого, как только мы создаем нашу метафункцию для интроспекции функции по имени, мы можем повторно использовать метафункцию для интроспекции любого типа, имеющего какую-либо функцию, для этого имени.