BOOST_FUSION_ADAPT_STRUCT を使って、構造体の変数をイテレータを使ってアクセスする2020年03月06日 13時23分38秒

BOOST_FUSION_ADAPT_STRUCT はマクロを用いて、クラスや構造体のメンバ変数にイテレータを用いたアクセスを可能にする。

文章で説明するよりも例を用いた方が分かりやすい。

#include <string>
#include <iostream>
#include <boost/fusion/algorithm.hpp>
    
#include <boost/fusion/include/adapt_struct.hpp>
 
struct person
{
    std::string name_;
    int age_;

    person( const std::string& name, int age )
        : name_( name )
        , age_( age )
    {
    }
};

BOOST_FUSION_ADAPT_STRUCT(
    person
    , ( std::string, name_ )
    , ( 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() );
}
このプログラムでは、person と言う構造体を作る。そこに、名前と年齢の変数を作った。 そして、インスタンスを生成し、fusion の for_each で構造体の内容をプリントしている。

print はファンクタを用いた実装。cout が型情報を頼りに良きに計らってくれるので、今回はテンプレートを用いた単純な実装になっている。これを、型の種類毎に実装を変える事も出来る。

また、この実装は c++11 の機能に依存しているので、c++03 等ではコンパイルできない。

% c++ -std=c++11 -I /usr/local/include boost_fusion_adapt_struct1.cpp
% ./a.out 
Boost User
10
また、ブーストライブラリがインストールされている場所によっては、-I が必要になる。これはヘッダファイルのみの実装なので、BOOST_FUSION_ADAPT_STRUCT は -l の追加は必要ない。