使用Boost.Fusion函数列表

时间:2011-03-25 07:33:46

标签: c++ boost boost-fusion boost-lambda

我正在尝试将函数对象列表应用于以下代码中的某个值。 但是这个代码导致了 的 ERR
boost_1_44 \ boost \ fusion \ algorithm \ _ iteration \ detail \ for_each.hpp(82):错误C2064:

如何将函数对象列表应用于某个值?

double doublef2(double x,double y){return 2*x+y; }
double doublef3(double x,double y){return 3*x*y; }
double doublef4(double x,double y){return 4+x*y; }
main(){
    boost::fusion::vector<
        boost::function<double (double,double)>,
        boost::function<double (double,double)>,
        boost::function<double (double,double)>
       > tt;


    boost::fusion::at_c<0>(tt)= & doublef2;
    boost::fusion::at_c<1>(tt)= & doublef3;
    boost::fusion::at_c<2>(tt)= & doublef4;

boost::fusion::for_each(tt, std::cout << boost::lambda::_1(10,100) << '\n');

}

2 个答案:

答案 0 :(得分:2)

你的问题与boost.fusion完全无关。相反,您的问题是由尝试从boost.lambda仿函数调用非延迟仿函数(不使用bind)引起的。使用boost::fusion::for_each和适当的仿函数代替boost.lambda仿函数可以获得预期的结果:

#include <iostream>
#include <boost/function.hpp>
#include <boost/fusion/include/at_c.hpp>
#include <boost/fusion/include/vector.hpp>
#include <boost/fusion/include/for_each.hpp>

double doublef2(double x, double y) { return 2. * x + y; }
double doublef3(double x, double y) { return 3. * x * y; }
double doublef4(double x, double y) { return 4. + x * y; }

struct proper_functor
{
    typedef void result_type;

    proper_functor(double x, double y) : x_(x), y_(y) { }

    template<typename F>
    void operator ()(F const& f) const { std::cout << f(x_, y_) << '\n'; }

private:
    double x_, y_;
};

int main()
{
    boost::fusion::vector<
        boost::function<double (double, double)>,
        boost::function<double (double, double)>,
        boost::function<double (double, double)>
    > tt;

    boost::fusion::at_c<0>(tt) = doublef2;
    boost::fusion::at_c<1>(tt) = doublef3;
    boost::fusion::at_c<2>(tt) = doublef4;

    boost::fusion::for_each(tt, proper_functor(10., 100.));
}

顺便说一句,在实际代码中遇到boost.fusion的这种用法会很奇怪;融合容器适用于同类型,如果您使用的是同一类型,请使用std::array / std::tr1::array / boost::array代替并节省一些编译时间。

答案 1 :(得分:0)

如上所述 ildjarn ,直接应用函数调用运算符() lambda::placeholders似乎无法以某种方式工作。 在这种情况下,lambda::bind可能会达到目的 例如:

fusion::for_each(tt, cout << lambda::bind( lambda::_1, 10, 100 ) << '\n')

希望这有帮助