TTI макрос<BOOST_TTI_HAS_MEMBER_DATA
>интроспектирует данные членов класса.
BOOST_TTI_HAS_MEMBER_DATA макрос берет один параметр, который является именем данных внутреннего члена, существование которого программист хочет проверить. Макро генерирует метафункцию, называемую «has_member_data_name_of_inner_member_data».
Метафункция может быть вызвана двумя различными способами.
Первый способ заключается в прохождении двух параметров. Первый параметр — это тип, который включается в интроспективу, а второй параметр — тип данных участника.
Второй способ — передать ему один параметр, который является указателем на тип члена. Этот тип имеет форму:
MemberData_Type Enclosing_Type::*
Метафункция возвращает один тип, называемый «тип», который является импульсом::mpl::bool_. В качестве удобства метафункция возвращает значение этого типа непосредственно в виде константы времени компиляции, называемой «значением». Это значение является истинным или ложным в зависимости от того, существуют или нет данные о внутреннем элементе определенного типа.
Вы генерируете метафункцию, ссылаясь на макрос с именем данных внутреннего члена:
BOOST_TTI_HAS_MEMBER_DATA(AMemberData)
генерирует метафункцию под названием «has_member_data_AMemberData» в текущем объеме.
Вы вызываете метафункцию, инстанцируя шаблон с прилагающимся типом для интроспектирования и типом данных участника или инстанцируя шаблон с указателем на тип данных участника. Возвратное значение, называемое «значение», представляет собой константу времени компиляции, сообщающую вам, существуют ли данные участника.
has_member_data_AMemberData<Enclosing_Type,MemberData_Type>::value
OR
has_member_data_AMemberData<MemberData_Type Enclosing_Type::*>::value
Сначала мы генерируем метафункции для различных имен данных внутренних членов:
#include <boost/tti/has_member_data.hpp>
BOOST_TTI_HAS_MEMBER_DATA(data1)
BOOST_TTI_HAS_MEMBER_DATA(data2)
BOOST_TTI_HAS_MEMBER_DATA(data3)
Давайте создадим некоторые пользовательские типы, которые мы хотим интроспектировать.
struct AClass
{
};
struct Top
{
int data1;
AClass * data2;
};
struct Top2
{
long data1;
Top data3;
};
Наконец, мы прибегаем к нашей метафункции и возвращаем нашу ценность. Все это происходит во время компиляции и может быть использовано программистами, выполняющими компиляцию метапрограммирования шаблона времени.
Мы покажем обе формы в следующих примерах. Обе формы полностью взаимозаменяемы по желаемому результату.
has_member_data_data1<Top,int>::value;
has_member_data_data1<Top,long>::value;
has_member_data_data1<Top2,int>::value;
has_member_data_data1<long Top2::*>::value;
has_member_data_data2<AClass * Top::*>::value;
has_member_data_data2<Top,int *>::value;
has_member_data_data3<int Top2::*>::value;
has_member_data_data3<Top Top2::*>::value;
Макрокодирует только имя данных участников, для которых мы ищем, и тот факт, что мы интроспектируем данные участников в закрытом типе.
Из-за этого, как только мы создадим нашу метафункцию для интроспекции данных внутреннего члена по имени, мы можем повторно использовать метафункцию для интроспекции любого закрытого типа, имеющего любой тип данных внутреннего члена для этого имени.