используя Boost.Fusion список функций - PullRequest
1 голос
/ 25 марта 2011

Я пытаюсь применить список объектов функции к некоторому значению в следующем коде.Но этот код вызывает err
boost_1_44 \ boost \ fusion \ attribute \ 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 ]

2 голосов
/ 25 марта 2011

Ваша проблема совершенно не связана с 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 вместо этого и сэкономьте себе немного времени на компиляцию.

0 голосов
/ 25 марта 2011

Как упоминалось ildjarn , применение оператора вызова функции () непосредственно к lambda::placeholders похоже не работает как-то. Вероятно, в этом случае lambda::bind будет соответствовать цели.
Например:

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

Надеюсь, это поможет

...