Макрос TTI<BOOST_TTI_HAS_STATIC_MEMBER_DATA
>интроспектирует статические данные о членах класса.
BOOST_TTI_HAS_STATIC_MEMBER_DATA макрос берет один параметр, который является именем внутреннего статического элемента данных, существование которого программист хочет проверить. Макро генерирует метафункцию, называемую «has_static_member_data_»name_of_inner_static_member_data.
Метафункция может быть вызвана передачей ей замкнутого типа для интроспективы и типа статических данных члена.
Метафункция возвращает один тип, называемый «тип», который является импульсом::mpl::bool_. В качестве удобства метафункция возвращает значение этого типа непосредственно в виде константы времени компиляции, называемой «значением». Это истинно или ложно в зависимости от того, существуют или нет внутренние статические данные о членах.
Вы генерируете метафункцию, используя макрос с именем внутренних статических данных:
BOOST_TTI_HAS_STATIC_MEMBER_DATA(AStaticMemberData)
генерирует метафункцию, называемую «has_static_member_data_AStaticMemberData» в текущем объеме.
Вы вызываете метафункцию, инстанцируя шаблон с закрытым типом для самоанализа и типом статических данных члена. Возвратное значение, называемое «значением», представляет собой константу компиляции времени.
has_static_member_data_AStaticMemberData<Enclosing_Type,StaticMemberData_Type>::value
Сначала мы генерируем метафункции для различных имен данных внутренних членов:
#include <boost/tti/has_static_member_data.hpp>
BOOST_TTI_HAS_STATIC_MEMBER_DATA(data1)
BOOST_TTI_HAS_STATIC_MEMBER_DATA(data2)
BOOST_TTI_HAS_STATIC_MEMBER_DATA(data3)
Давайте создадим некоторые пользовательские типы, которые мы хотим интроспектировать.
struct AClass
{
};
struct Top
{
static int data1;
static AClass * data2;
};
struct Top2
{
static long data1;
static Top data3;
};
Наконец, мы прибегаем к нашей метафункции и возвращаем нашу ценность. Все это происходит во время компиляции и может быть использовано программистами, выполняющими компиляцию метапрограммирования шаблона времени.
has_static_member_data_data1<Top,int>::value;
has_static_member_data_data1<Top,long>::value;
has_static_member_data_data1<Top2,int>::value;
has_static_member_data_data1<Top2,long>::value;
has_static_member_data_data2<Top,AClass *>::value;
has_static_member_data_data2<Top,int *>::value;
has_static_member_data_data3<Top2,int>::value;
has_static_member_data_data3<Top2,Top>::value;
Макрокодирует только название статических данных о членах, для которых мы ищем, и тот факт, что мы ищем статические данные о членах в закрытом типе.
Из-за этого, как только мы создаем нашу метафункцию для интроспекции внутренних статических данных о членах по имени, мы можем повторно использовать метафункцию для интроспекции любого закрытого типа, имеющего любой внутренний статический тип данных о членах для этого имени.