BOOST_FUSION_ADAPT_ADT

Boost 1.44.0でアンドキュメントに存在していたBOOST_FUSION_ADAPT_CLASSが、Boost 1.45.0でBOOST_FUSION_ADAPT_ADTという名前に変更され、正式にリリースされました。


以下のエントリのプログラムを、BOOST_FUSION_ADAPT_ADTで書きなおしてみます。


BOOST_FUSION_ADAPT_CLASS - Faith and Brave - C++で遊ぼう

#include <iostream>
#include <boost/fusion/include/algorithm.hpp>
#include <boost/fusion/include/adapt_adt.hpp>
#include <boost/fusion/include/as_vector.hpp>

namespace fusion = boost::fusion;

class point {
    int x_, y_;
public:
    point(int x, int y) : x_(x), y_(y) {}

    int get_x() const { return x_; }
    int get_y() const { return y_; }
    void set_x(int x) { x_ = x; }
    void set_y(int y) { y_ = y; }
};

BOOST_FUSION_ADAPT_ADT(
    point,
    (int, int, obj.get_x(), obj.set_x(val))
    (int, int, obj.get_y(), obj.set_y(val))
);

struct disp {
    template <class T>
    void operator()(const T& x) const
    {
        std::cout << x << std::endl;
    }
};

int main()
{
    const point p(1, 2);
    fusion::for_each(p, disp());
}
1
2

基本はインクルードするヘッダとマクロ名が変わっただけで、それに加えてFusionアルゴリズムに渡す際にas_vectorする必要がなくなっています。


参照:
BOOST_FUSION_ADAPT_ADT