BOOST_FUSION_ADAPT_STRUCT を使って、構造体の内部構造体にアクセスする2020年05月29日 12時29分33秒

BOOST_FUSION_ADAPT_STRUCT を使って、構造体の変数の順序と違った順でイテレータを使う実験をした。

マクロの為 BOOST_FUSION_ADAPT_STRUCT は namespace 内で使えない等の制約がある。しかし、マクロである為、二つめに書くフィールドアクセスは直下のメンバ変数名で無くても大丈夫か気になった。

早速実験。名前をプリントする実験を元に氏と名で構造体を分けてみた。今回はクラス名を若干分かりやすくする為に大文字に変更。

#include <string>
#include <iostream>
#include <boost/fusion/algorithm.hpp>

#include <boost/fusion/include/adapt_struct.hpp>

struct Name
{
    std::string first_;
    std::string last_;
};

struct Person
{
    Name name_;
    int age_;

    Person( const Name& name, int age )
        : name_( name )
        , age_( age )
    {
    }
};

BOOST_FUSION_ADAPT_STRUCT(
    Person
    , ( std::string, name_.first_ )
    , ( std::string, name_.last_ )
    , ( int, age_ )
)

struct Print
{
    template< typename T >
    void operator()( const T& t ) const
    {
        std::cout << t << std::endl;
    }
};

int main()
{
    Person p( { "Boost", "User" }, 10 );
    boost::fusion::for_each( p, Print() );
}
大きくないプログラムだが、結構長くなった。
% c++ -I /usr/local/include boost_fusion_adapt_struct.cpp
% ./a.out 
Boost
User
10
コンパイルをすると、何のエラーも出なかったので期待は高い。無事に名字と名前の内部構造体にアクセスすることが出来た。

前回次回