Макрос TTI<BOOST_TTI_HAS_DATA
>интроспектирует данные класса. Данные могут быть данными члена или статичными данными члена.
BOOST_TTI_HAS_DATA макрос берет один параметр, который является именем данных внутреннего члена или статических данных члена, существование которых программист хочет проверить. Макро генерирует метафункцию, называемую «has_data_»name_of_inner_data.
Метафункция может быть вызвана путем передачи ей прилагающего типа для интроспективы и типа данных.
Метафункция возвращает один тип, называемый «тип», который является импульсом::mpl::bool_. В качестве удобства метафункция возвращает значение этого типа непосредственно в виде константы времени компиляции, называемой «значением». Это истинно или ложно в зависимости от того, существуют ли внутренние данные указанного типа или нет.
Вы генерируете метафункцию, вызывая макрос с именем внутреннего элемента данных:
BOOST_TTI_HAS_DATA(AData)
генерирует метафункцию под названием «has_data_AStaticMemberData» в текущем объеме.
Вы вызываете метафункцию, инстанцируя шаблон с закрытым типом для самоанализа и типом данных. Возвратное значение, называемое «значением», представляет собой константу компиляции времени.
has_data_AData<Enclosing_Type,Data_Type>::value
Сначала мы генерируем метафункции для различных внутренних имен данных:
#include <boost/tti/has_data.hpp>
BOOST_TTI_HAS_DATA(data1)
BOOST_TTI_HAS_DATA(data2)
BOOST_TTI_HAS_DATA(data3)
Давайте создадим некоторые пользовательские типы, которые мы хотим интроспектировать.
struct AClass
{
};
struct Top
{
int data1;
static AClass * data2;
};
struct Top2
{
static long data1;
Top data3;
};
Наконец, мы прибегаем к нашей метафункции и возвращаем нашу ценность. Все это происходит во время компиляции и может быть использовано программистами, выполняющими компиляцию метапрограммирования шаблона времени.
has_data_data1<Top,int>::value;
has_data_data1<Top,long>::value;
has_data_data1<Top2,int>::value;
has_data_data1<Top2,long>::value;
has_data_data2<Top,AClass *>::value;
has_data_data2<Top,int *>::value;
has_data_data3<Top2,int>::value;
has_data_data3<Top2,Top>::value;
Макрокодирует только название данных, для которых мы ищем, и тот факт, что мы ищем данные в закрытом виде.
Из-за этого, как только мы создадим нашу метафункцию для интроспекции внутренних данных по имени, мы можем повторно использовать метафункцию для интроспекции любого закрытого типа, имеющего любой внутренний тип данных, для этого имени.