2011-03-25 5 views
1

다음 코드에서 함수 개체 목록을 일부 값에 적용하려고합니다. 그러나이 코드 원인 잘못을
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

잘하는 데 도움이, 당신은 오류 메시지의 흥미로운 부분을 왼쪽 - 메시지를! –

답변

2

귀하의 문제는 전적으로 부스트 퓨전과 관련이 없습니다. 오히려, 문제는 boost.lambda 함수 기에서 non-lazy functor를 호출하려고 시도 할 때 발생합니다 (bind을 사용하지 않음). 대신 boost.lambda 펑터의 적절한 펑와 boost::fusion::for_each를 사용하여 결과가 예상 그물 : 여담으로

#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을 사용하고 컴파일 시간을 절약하십시오. lambda::placeholders 보인다

0

직접에 ildjarn 언급, 함수 호출 연산자 ()을 적용 으로 어떻게 든 작동하지. 아마도 lambda::bind이이 경우의 목적을 충족합니다. 예를 들어
:

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

희망이