1

次のコードで、関数オブジェクトのリストをいくつかの値に適用しようとしています。しかし、このコードは 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');

}
4

2 に答える 2

2

あなたの問題は、boost.fusion とはまったく関係ありません。むしろ、boost.lambda ファンクターから (を使用せずにbind) 非遅延ファンクターを呼び出そうとすると、問題が発生します。boost::fusion::for_eachboost.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して、コンパイル時間を節約してください。

于 2011-03-25T08:10:52.983 に答える
0

ildjarnが述べたように、関数呼び出し演算子を直接適用すると、どういうわけか機能し ないようです。この場合、おそらく目的を満たします。 例えば:()lambda::placeholderslambda::bind

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

お役に立てれば

于 2011-03-25T08:33:46.047 に答える