我正在尝试将函数对象列表应用于以下代码中的某个值。
但是这个代码导致了
的 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');
}
答案 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')
希望这有帮助