BOOST_FUSION_ADAPT_TPL_ADT - это макрос, который может быть использован для создания всех необходимых шаблонов для адаптации произвольного типа класса шаблонов в качестве модели Random Access Sequence.
BOOST_FUSION_ADAPT_TPL_ADT(
(template_param0)(template_param1)...,
(type_name) (specialization_param0)(specialization_param1)...,
([attribute_type0, attribute_const_type0,] get_expr0, set_expr0)
([attribute_type1, attribute_const_type1,] get_expr1, set_expr1)
...
)
Приведенный выше макрос генерирует необходимый код для адаптации type_name
или произвольной специализации type_name
в качестве модели Random Access Sequence. Последовательность (template_param0)(template_param1)...
объявляет имена используемых параметров типа шаблона. Последовательность (специализация_param0)(специализация_param1)...
объявляет параметры шаблона фактической специализации type_name
, которая адаптирована как последовательность слияния. Последовательность (attribute_typeN, атрибут_const_typeN, get_exprN, set_exprN)
вчетверо объявляет типы, типы const, get-выражения и set-выражения элементов, которые являются частью адаптированной последовательности синтеза. get_exprN
- это выражение, которое вызывается для получения N элемента экземпляра type_name
. Это выражение может иметь доступ к переменной, названной obj
типа type_name
или type_nameconst&
, которая представляет собой базовый экземпляр type_name
. attribute_typeN
может указывать типы, которые get_exprN
обозначает, когда опущенный тип выведен из [get_exprN] возвратного типа через BOOST_TYPEOF. На компиляторе отсутствующая поддержка для вариадных макросов авто может быть использована, чтобы избежать повторения типа. set_exprN
является выражением, которое вызывается для установки N элемента экземпляра type_name
. Это выражение может иметь доступ к переменным, названным obj
типа type_name&
, которые представляют соответствующий экземпляр type_name
, и val
произвольного констквалифицированного параметра типа эталонного шаблона Val
, который представляет правильный операнд выражения назначения.
Фактический тип обратного доступа к внутренней последовательности синтеза (мета-) функционирует при вызове (пример) type_name
является прокси-типом. Этот тип неявно преобразуется в тип атрибута через get_exprN
и пересылает назначение базовому элементу через set_exprN
. Тип значения (то есть тип, возвращенный результат_::результат_::значение_at
и результат_of::значение_at_c
) атрибут_типN с удалением ссылки.
Макрос должен использоваться в глобальном масштабе, и type_name
должно быть полное имя класса шаблона.
#include <boost/fusion/adapted/adt/adapt_adt.hpp>
#include <boost/fusion/include/adapt_adt.hpp>
namespace demo
{
template<typename Name, typename Age>
struct employee
{
private:
Name name;
Age age;
public:
void set_name(Name const& n)
{
name=n;
}
void set_age(Age const& a)
{
age=a;
}
Name const& get_name()const
{
return name;
}
Age const& get_age()const
{
return age;
}
};
}
BOOST_FUSION_ADAPT_TPL_ADT(
(Name)(Age),
(demo::employee) (Name)(Age),
(Name const&, Name const&, obj.get_name(), obj.set_name(val))
(Age const&, Age const&, obj.get_age(), obj.set_age(val)))
demo::employee<std::string, int> e;
boost::fusion::front(e)="Edward Norton";
boost::fusion::back(e)=41;
std::cout << e.get_name() << " is " << e.get_age() << " years old" << std::endl;
adt_attribute_proxy