Макро TTIBOOST_TTI_HAS_MEMBER_FUNCTION
Просматривает функцию члена класса.
BOOST_TTI_HAS_MEMBER_FUNCTION Он берет один параметр, который называется функцией внутреннего члена, существование которой программист хочет проверить. Макро генерирует метафункцию, называемую «has_member_function_»name_of_inner_member_function.
Метафункция может быть вызвана двумя различными способами.
Первый способ вызова метафункции заключается в том, чтобы передать ей прилагаемый тип для интроспективы и подпись для функции члена в виде серии отдельных аргументов шаблона. Подпись для функции-члена состоит из шаблонных аргументов типа возврата, факультативных типов параметров в виде бустера::mpl передней последовательности типов и факультативного типа тега Boost FunctionTypes. Типичным повышением::mpl передней последовательности типов является повышение::mpl::vector<>.
Факультативный тип тега Boost FunctionTypes может использоваться для указания cv-квалификации. Это означает, что вы можете добавить «const», «volatile» или оба, указав соответствующий тип тега. Альтернативой использованию типа тега является указание прилагаемого типа как «const», «volatile» или обоих. В качестве примера, если вы указываете тип тега как «boost::function_types::const_qualified» или если вы указываете прилагаемый тип как «const T», функция-член, которую вы интроспектируете, должна быть функцией const.
Второй способ вызова метафункции — передать ей один параметр, который является указателем на функцию члена. Этот тип имеет форму:
Return_Type ( Enclosing_Type::* ) ( Parameter_Types ) cv_qualifier(s)
где параметр _ Типы могут быть пустыми или разделенным запятой списком типов параметров, если существует более одного типа параметров. Cv-калификатор может быть «const», «летучим» или «const volatile».
Метафункция возвращает один тип, называемый «тип», который является импульсом::mpl::bool_. В качестве удобства метафункция возвращает значение этого типа непосредственно в виде константы времени компиляции, называемой «значением». Это «значение» истинно или ложно в зависимости от того, существует ли функция внутреннего члена, указанной подписи или нет.
Вы генерируете метафункцию, вызывая макрос с именем функции внутреннего члена:
BOOST_TTI_HAS_MEMBER_FUNCTION(AMemberFunction)
генерирует метафункцию под названием «has_member_function_AMemberFunction» в текущем объеме.
Вы вызываете метафункцию, инстанцируя шаблон с закрытым типом для самоанализа и подписью функции члена в виде ряда параметров шаблона. В качестве альтернативы вы можете вызвать метафункцию, передав ей один тип, который указывает на функцию члена.
Обратное значение, называемое «значением», представляет собой константу компиляции времени.
has_member_function_AMemberFunction
<
Enclosing_Type,
MemberFunction_ReturnType,
boost::mpl::vector<MemberFunction_ParameterTypes>,
boost::function_types::SomeTagType
>::value
OR
has_member_function_AMemberFunction
<
MemberFunction_ReturnType (Enclosing_Type::*) (MemberFunction_ParameterTypes) optional_cv_qualification
>::value
Сначала мы генерируем метафункции для различных имен внутренних членов:
#include <boost/tti/has_member_function.hpp>
BOOST_TTI_HAS_MEMBER_FUNCTION(function1)
BOOST_TTI_HAS_MEMBER_FUNCTION(function2)
BOOST_TTI_HAS_MEMBER_FUNCTION(function3)
Давайте создадим некоторые пользовательские типы, которые мы хотим интроспектировать.
struct AClass
{
};
struct Top
{
int function1();
AClass function2(double,short *);
};
struct Top2
{
long function2(Top &,int,bool,short,float);
Top * function3(long,int,AClass &);
};
Наконец, мы прибегаем к нашей метафункции и возвращаем нашу ценность. Все это происходит во время компиляции и может быть использовано программистами, выполняющими компиляцию метапрограммирования шаблона времени.
Мы покажем обе формы в следующих примерах. Обе формы полностью взаимозаменяемы по желаемому результату.
has_member_function_function1<Top,int>::value;
has_member_function_function1<Top,int,boost::mpl::vector<> >::value;
has_member_function_function1<Top2,int>::value;
has_member_function_function2<AClass (Top::*) (double,short *)>::value;
has_member_function_function2<AClass (Top2::*) (double,short *)>::value;
has_member_function_function2<long (Top2::*) (Top &,int,bool,short,float)>::value;
has_member_function_function3<int (Top2::*) ()>::value;
has_member_function_function3<Top2,Top *,boost::mpl::vector<long,int,AClass &> >::value;
Макрокодирует только имя функции-члена, для которой мы ищем, и тот факт, что мы интроспектируем функцию-член в закрытом типе.
Из-за этого, как только мы создаем нашу метафункцию для интроспекции функции-члена по имени, мы можем повторно использовать метафункцию для интроспекции любого типа, имеющего какую-либо функцию-член для этого имени.