BOOST_FUSION_ADAPT_ASSOC_TPL_ADT является макросом, который может быть использован для создания всех необходимых шаблонов для адаптации произвольного типа класса шаблонов в качестве моделиСлучайной Последовательности ДоступаиАссоциативной Последовательности.
BOOST_FUSION_ADAPT_ASSOC_TPL_ADT(
(template_param0)(template_param1)...,
(type_name) (specialization_param0)(specialization_param1)...,
([attribute_type0, attribute_const_type0,] get_expr0, set_expr0, key_type0)
([attribute_type1, attribute_const_type1,] get_expr1, set_expr1, key_type1)
...
)
Приведенный выше макрос генерирует необходимый код для адаптации<type_name
>или произвольной специализации<type_name
>в качестве моделиСлучайной последовательности доступаиАссоциативной последовательности. Последовательность<(template_param0)(template_param1)...
>объявляет имена используемых параметров типа шаблона. Последовательность<(specialization_param0)(specialization_param1)...
>объявляет параметры шаблона фактической специализации<type_name
>, которая адаптирована в виде последовательности слияния. Последовательность<([attribute_typeN,
attribute_const_typeN,
>get_exprN, set_exprN, key_typeN5-ти звенья декларируют типы, типы const, get-выражения, set-выражения и ключевые типы элементов, которые являются частью адаптированной последовательности слияния.<get_exprN
>является выражением, которое вызывается, чтобы получитьNэлемент экземпляра<type_name
>. Это выражение может иметь доступ к переменной, названной<obj
>типа<type_name&
>или<type_nameconst&
>, которая представляет основной экземпляр<type_name
>.<attribute_typeN
>и<attribute_const_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
>. Тип значения (то есть тип, возвращаемый<result_of::value_of
>,<result_of::value_of_data
>,<result_of::value_at
>,<result_of::value_at_c
>и<result_of::value_at_key
>) элементаNявляется<attribute_typeN
>с удалённым конст-калификатором и ссылкой.
Макрос должен использоваться в глобальном масштабе, и<type_name
>должно быть полное имя класса шаблона.
#include <boost/fusion/adapted/adt/adapt_assoc_adt.hpp>
#include <boost/fusion/include/adapt_assoc_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;
}
};
}
namespace keys
{
struct name;
struct age;
}
BOOST_FUSION_ADAPT_ASSOC_TPL_ADT(
(Name)(Age),
(demo::employee) (Name)(Age),
(Name const&, Name const&, obj.get_name(), obj.set_name(val), keys::name)
(Age const&, Age const&, obj.get_age(), obj.set_age(val), keys::age))
demo::employee<std::string, int> e;
at_key<keys::name>(e)="Edward Norton";
at_key<keys::age>(e)=41;
std::cout << e.get_name() << " is " << e.get_age() << " years old" << std::endl;
<adt_attribute_proxy
>