読者です 読者をやめる 読者になる 読者になる

BOOST_FUSION_ADAPT_ASSOC_STRUCT

C++

BOOST_FUSION_ADAPT_ASSOC_STRUCTは、ユーザー定義型をFusionのRandom Access SequenceおよびAssociative Sequenceとしてアダプトするためのマクロです。
これを使用することで、ユーザー定義型内にあるとくに意味を持たせていなかった変数などに、後付けで名前を付けることができ、名前なしのシーケンスとしても扱うことができます。

#include <boost/assert.hpp>
#include <boost/fusion/include/map.hpp>
#include <boost/fusion/include/at_key.hpp>
#include <boost/fusion/include/at_c.hpp>
#include <boost/fusion/include/adapt_assoc_struct.hpp>

namespace fusion = boost::fusion;

struct x {};
struct y {};
struct z {};

struct vec {
    int ar[3];
};

BOOST_FUSION_ADAPT_ASSOC_STRUCT(
    vec,
    (int, ar[0], x)
    (int, ar[1], y)
    (int, ar[2], z)
)

int main()
{
    const vec v = {3, 1, 4};

    // Associative Sequence
    BOOST_ASSERT(fusion::at_key<x>(v) == 3);
    BOOST_ASSERT(fusion::at_key<y>(v) == 1);
    BOOST_ASSERT(fusion::at_key<z>(v) == 4);

    // Random Access Sequence
    BOOST_ASSERT(fusion::at_c<0>(v) == 3);
    BOOST_ASSERT(fusion::at_c<1>(v) == 1);
    BOOST_ASSERT(fusion::at_c<2>(v) == 4);
}