BOOST_FUSION_ADAPT_STRUCTをちょっと便利に

Boost.FusionのBOOST_FUSION_ADAPT_STRUCTマクロを使うとはユーザ定義型をFusionのシーケンスとして扱えるようにできます(参考:ユーザー定義のクラスをFusionのコンテナ(タプル)として使用する - Faith and Brave - C++で遊ぼう)が、メンバの型をいちいち書かないといけないので面倒です。
でも、ちょっとしたヘルパマクロで型の指定を省くことができるようになります。そう、C++0xならね。

#define TRANSFORM_STRUCT_MEMBER(ign, name, member) (decltype(name::member), member)
#define FUSION_ADAPT_STRUCT_AUTO(name, members) \
  BOOST_FUSION_ADAPT_STRUCT(name, BOOST_PP_SEQ_FOR_EACH(TRANSFORM_STRUCT_MEMBER, name, members))

これだけです。

BOOST_FUSION_ADAPT_STRUCT (
    person,
    (int, id)
    (int, age)
    (std::string, name)
)

こうなっていたのが、

FUSION_ADAPT_STRUCT_AUTO(person, (id)(age)(name))

これでおしまいです。楽ちん楽ちん。