2011-03-25 54 views
1

我想将函数对象的列表应用于下面的代码中的某个值。 但是这个代码的原因 ERR
boost_1_44 \提升\融合\算法\重复\详细\ for_each.hpp(82):错误C2064:
使用Boost.Fusion函数列表

如何应用函数对象的列表,以一定的价值?

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'); 

} 
+0

好了,你留下的错误消息的有趣的部分了 - 消息! – 2011-03-25 07:41:52

回答

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,并节省一些编译时间。

0

ildjarn提到,赋予功能调用操作()直接 lambda::placeholders好像不是以某种方式工作。 可能lambda::bind将符合这种情况下的目的。
例如:

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

希望这有助于