BOOST_FUSION_ADAPT_ASSOC_ADT является макросом, который может быть использован для создания всех необходимых шаблонов для адаптации произвольного типа класса в качестве моделиСлучайной Последовательности ДоступаиАссоциативной Последовательности.
BOOST_FUSION_ADAPT_ASSOC_ADT(
type_name,
([attribute_type0, attribute_const_type0,] get_expr0, set_expr0, key_type0)
([attribute_type1, attribute_const_type1,] get_expr1, set_expr1, key_type1)
...
)
Приведенный выше макрос генерирует необходимый код для адаптации<type_name
>в качестве моделиСлучайной Последовательности ДоступаиАссоциативной Последовательности. Последовательность<(attribute_typeN,
attribute_const_typeN, get_exprN,
set_exprN, key_typeN)
>5-ти звеньев объявляет типы, типы 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
{
struct employee
{
private:
std::string name;
int age;
public:
void set_name(std::string const& n)
{
name=n;
}
void set_age(int a)
{
age=a;
}
std::string const& get_name()const
{
return name;
}
int get_age()const
{
return age;
}
};
}
namespace keys
{
struct name;
struct age;
}
BOOST_FUSION_ADAPT_ASSOC_ADT(
demo::employee,
(obj.get_name(), obj.set_name(val), keys::name)
(obj.get_age(), obj.set_age(val), keys::age))
demo::employee 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
>