2011-03-25 65 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') 

希望這有助於