| Home | Libraries | People | FAQ | More

### BOOST_FUSION_ADAPT_ADT

BOOST_FUSION_ADAPT_ADT is a macro than can be used to generate all the necessary boilerplate to adapt an arbitrary class type as a model of Random Access Sequence.

##### Synopsis

    BOOST_FUSION_ADAPT_ADT(
        type_name,
        (attribute_type0, attribute_const_type0, get_expr0, set_expr0)
        (attribute_type1, attribute_const_type1, get_expr1, set_expr1)
        ...
        )

##### Expression Semantics

The above macro generates the necessary code to adapt `type_name` as a model of Random Access Sequence. The sequence of `(attribute_typeN, attribute_const_typeN, get_exprN, set_exprN)` quadruples declares the types, const types, get-expressions and set-expressions of the elements that are part of the adapted fusion sequence. `get_exprN` is the expression that is invoked to get the Nth element of an instance of `type_name`. This expression may access a variable named `obj` of type `type_name&` or `type_name const&` which represents the underlying instance of `type_name`. `attribute_typeN` and `attribute_const_typeN` may specify the types that `get_exprN` denotes to. `set_exprN` is the expression that is invoked to set the Nth element of an instance of `type_name`. This expression may access variables named `obj` of type `type_name&`, which represent the corresponding instance of `type_name`, and `val` of an arbitrary const-qualified reference template type parameter `Val`, which represents the right operand of the assignment expression.

The actual return type of fusion's intrinsic sequence access (meta-)functions when in invoked with (an instance of) `type_name` is a proxy type. This type is implicitly convertible to the attribute type via `get_exprN` and forwards assignment to the underlying element via `set_exprN`. The value type (that is the type returned by `result_of::value_of`, `result_of::value_at` and `result_of::value_at_c`) of the Nth element is `attribute_typeN` with const-qualifier and reference removed.

The macro should be used at global scope, and `type_name` should be the fully namespace qualified name of the class type to be adapted.

##### Header

    #include <boost/fusion/adapted/adt/adapt_adt.hpp>
    #include <boost/fusion/include/adapt_adt.hpp>

##### Example

    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;
            }
        };
    }

    BOOST_FUSION_ADAPT_ADT(
        demo::employee,
        (std::string const&, std::string const&, obj.get_name(), obj.set_name(val))
        (int, int, obj.get_age(), obj.set_age(val)))

    demo::employee e;
    front(e)="Edward Norton";
    back(e)=41;
    //Prints 'Edward Norton is 41 years old'
    std::cout << e.get_name() << " is " << e.get_age() << " years old" << std::endl;

##### See also

`adt_attribute_proxy`