BOOST_FUSION_DEFINE_STRUCT 内で fusion::vector を使用する

BOOST_FUSION_DEFINE_STRUCT 内で下記のように fusion::vector を使いたい場合があるとします。

BOOST_FUSION_DEFINE_STRUCT(
    BOOST_PP_EMPTY(),
    person,
    (std::string, name)
    (fusion::vector<int, int>, pos)
)


しかし、これでは "fusion::vector" が別々の引数であると解釈されてしまいエラーになってしまいます。
これは Boost 1.50.0 から追加された BOOST_IDENTITY_TYPE を使用して回避することが出来ます。

[ソース]

#include <boost/fusion/include/define_struct.hpp>
#include <boost/fusion/include/vector.hpp>
#include <boost/fusion/include/io.hpp>
#include <boost/utility/identity_type.hpp>
#include <iostream>
#include <string>

namespace fusion = boost::fusion;


BOOST_FUSION_DEFINE_STRUCT(
    BOOST_PP_EMPTY(),
    person,
    (std::string, name)
    (BOOST_IDENTITY_TYPE((fusion::vector<int, int>)), pos)
)


int
main(){
    person mami;
    mami.name = "mami";
    mami.pos = fusion::vector<int, int>(1, 2);
    std::cout << fusion::as_vector(mami) << std::endl;

    return 0;
}

[出力]

(mami (1 2))

[boost]

  • ver 1.51.0

[余談]

この記事自体、結構前に書き溜めしていたんですが、最近 BoostML で同じような質問が投稿されていたのを見かけたので返信してみましたヾ ゚∋゚)ノシ

英語むずい。