2011-02-12 5 views
2

나는 c.drive() 전화 run 원하는 :멤버 함수에서 펑터를 만드는 방법은 무엇입니까?

#include <functional> 
using namespace std; 

struct Car { 
    void drive() { } 
}; 

template <typename Function> 
void run(Function f) { 
    f(); 
} 

int main() { 
    Car c;  
    run(bind1st(mem_fun(&Car::drive), &c));  
    return 0; 
} 

이 컴파일되지 않고 오류 메시지가 나에게 도움이되지 않습니다 : F()에서

: (표준 '에 호출
전혀 일치 :: binder1st < 표준 : 하여금 mem_fun_t 무효 <, 자동차 > >)() '

전화에서 실행합니다 :
없음 n을 입력합니다 에서 아메드 'first_argument_type이라고' '클래스 표준 : : 하여금 mem_fun_t < 무효, 자동차 >'
에 'second_argument_type'라는 이름의 유형 '클래스 표준 : : 하여금 mem_fun_t < 자동차 > 무효'

없음 부스트하시기 바랍니다.

업데이트 : 문제가 해결 되더라도 업데이트 : TR1/

+0

허용하는 당신이 기꺼이 TR1 및/또는 C++ 0x에서 'bind'(등)? –

+0

예, 분명히 관심이 있으니 게시하십시오! 그러나 순수한 C++ 03에서 최종 솔루션이 필요합니다. – Ali

+0

당신은 오직 이런 식으로하고 싶습니까, 아니면 당신의 동기는 어떤 식 으로든'c.drive()'를 호출하는'run'을 호출하는 것입니다 (즉, 부스트를 사용하지 않고). – Mahesh

답변

7

bind1st은 바이너리 함수와 값에서 단항 함수를 만듭니다. 단항 함수에서 매개 변수를 취하지 않고 표준 C++ 03에서이를 지원할 수있는 함수가없는 함수를 만들려고합니다.

이렇게해야 할 것입니다.

template<class X, void (X::*p)()> 
class MyFunctor 
{ 
    X& _x; 
public: 
    MyFunctor(X& x) : _x(x) {} 
    void operator()() const { (_x.*p)(); } 
}; 

template <typename Function> 
void run(Function f) { 
    f(); 
} 

int main() { 
    Car c; 
    run(MyFunctor<Car, &Car::drive>(c)); 
    return 0; 
} 
+0

run (MyFunctor (c)) 호출시 드라이버를 인라인 할 수 있습니다. – bsobaid

9

부스트/TR1이/C++ 0X 해결책은 아주 간단하다 :

run(std::bind(&Car::drive, &c)); 
5

는 C + +0 솔루션을 사용하여 람다 - http://www.ideone.com/jz5B1 :

struct Car { 
    void drive() { } 
}; 

template <typename Function> 
void run(Function f) { 
    f(); 
} 

int main() { 
    Car c;  
    run([&c](){ c.drive(); });  
    return 0; 
} 
관련 문제