Ваша проблема совершенно не связана с 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 в реальном коде;Контейнеры Fusion предназначены для однородных типов, если вы используете один и тот же тип, используйте std::array
/ std::tr1::array
/ boost::array
вместо этого и сэкономьте себе немного времени на компиляцию.