boost::fusion::unfused

使うかどうかまだわかりませんが、昨日のfusedの対となるunfusedです。


Fusionのシーケンスで引数指定する関数オブジェクトを、
通常の方法で引数指定する関数オブジェクトへとアダプトします。

#include <functional>
#include <boost/assert.hpp>
#include <boost/fusion/include/make_vector.hpp>
#include <boost/fusion/include/fused.hpp>
#include <boost/fusion/functional/adapter/unfused.hpp>

namespace fusion = boost::fusion;

int main()
{
    typedef fusion::fused<std::plus<int> > func_type;
    func_type f;

//  BOOST_ASSERT(f(1, 2) == 3); // エラー

    int x = 1, y = 2;
    BOOST_ASSERT(fusion::unfused<func_type>()(x, y) == 3); // OK
}

make_unfused()ヘルパ関数

#include <functional>
#include <boost/assert.hpp>
#include <boost/fusion/include/make_vector.hpp>
#include <boost/fusion/include/fused.hpp>
#include <boost/fusion/functional/generation/make_unfused.hpp>

namespace fusion = boost::fusion;

int main()
{
    typedef fusion::fused<std::plus<int> > func_type;
    func_type f;

    int x = 1, y = 2;
    BOOST_ASSERT(fusion::make_unfused(f)(x, y) == 3);
}

それと、パラメータが参照になっているようで

fusion::make_unfused(f)(1, 2)

としたらエラーになりました。


参照:
boost::fusion::unfused