2009-12-11 4 views
6

함수 포인터를 예상하는 메서드를 호출해야하지만 실제로 전달할 함수는 functor입니다. 여기에 내가 할 노력하고있어의 예 : 나는 마지막 줄을 얻을 수있는 방법을 찾을 수 없어C++의 멤버 함수에 대한 함수 포인터

#include <iostream> 
#include "boost/function.hpp" 

typedef int (*myAdder)(int); 

int adderFunction(int y) { return(2 + y); } 

class adderClass { 
    public: 
    adderClass(int x) : _x(x) {} 
    int operator() (int y) { return(_x + y); } 

    private: 
    int _x; 
}; 

void printer(myAdder h, int y) { 
    std::cout << h(y) << std::endl; 
} 

int main() { 
    myAdder f = adderFunction; 

    adderClass *ac = new adderClass(2); 
    boost::function1<int, int> g = 
    std::bind1st(std::mem_fun(&adderClass::operator()), ac); 

    std::cout << f(1) << std::endl; 
    std::cout << g(2) << std::endl; 
    printer(f, 3); 
    printer(g, 4); // Is there a way to get this to work? 
} 

는, 프린터 (g, 4), 컴파일합니다. 이 방법을 사용할 수 있습니까? 내 제어 할 수있는 유일한 방법은 메서드 "main"과 클래스 "adderClass"입니다. 그래서 같은

답변

0

:

template<typename AdderT> 
void printer(AdderT h, int y) { 
    std::cout << h(y) << std::endl; 
} 

또한, 당신은 boost::function 필요하지 않습니다. 다음과 같이하면됩니다 :

adderClass ac(2); 
    std::cout << f(1) << std::endl; 
    std::cout << ac(2) << std::endl; 
    printer(f, 3); 
    printer(ac, 4); 
+0

그게 효과가 있지만, (언급하는 것을 잊어 버렸습니다.) "printer"메소드는 변경할 수 없습니다. – JamieC

+0

내 컨트롤에있는 모든 것은 "main"메서드와 "adderClass"클래스입니다. – JamieC

0

부스트 기능은 정상적인 기능 포인터처럼 동작하지만 다른 유형입니다. 따라서 함수 포인터에 부스트 함수를 할당 할 수는 없습니다. 코드에서

당신은 단순히

typedef boost::function1< int, int > myAdder; 

typedef int (*myAdder)(int); 

을 대체 할 수있는 모든 것이 작동합니다.

2

좋아, 여기에 또 다른 시도는 다음과 같습니다

class CallProxy 
{ 
public: 
    static adderClass* m_instance; 
    static int adder(int y) 
    { 
     return (*m_instance)(y); 
    } 
}; 

adderClass* CallProxy::m_instance = NULL; 


int main() { 
    myAdder f = adderFunction; 

    adderClass ac(2); 

    std::cout << f(1) << std::endl; 
    std::cout << ac(2) << std::endl; 
    printer(f, 3); 
    CallProxy::m_instance = &ac; 
    printer(CallProxy::adder, 4); 
} 

의 문제점은 당신이 printer 당신이 그것을 함수 포인터를 전송해야하므로 함수 포인터와 아무것도를받을 필요로 컴파일해야한다는 것입니다. 함수 포인터를 사용하면 인스턴스를 보유 할 사람이 없습니다. 따라서이 솔루션은 정적 데이터 멤버를 사용하여이를 수행합니다.

이 코드가 스레드로부터 안전하지 않다는 사실을 기억하십시오. 동시에 main을 실행하는 두 개의 스레드는 m_instance에 두 가지 다른 것을 넣을 수 있습니다.

+1

또한 re-entrant가 아닙니다 :'printer'가'main'을 호출하면 문제가 생깁니다. 그러나 최소한 이식성이 있으면 제약 조건을 적용하여 수행 할 수있는 최선의 방법이라고 생각합니다. 비 휴대용 솔루션의 경우 예를 들어 즉시 코드를 생성 할 수 있습니다. –

+0

@Steve Jessop :'main()'을 호출하는 것은 무엇이든 정의되지 않은 동작을 발생시킵니다 (§3.6.1/2 : "함수 main은 프로그램 내에서 사용되지 않아야합니다.") –

+0

@ Jerry Coffin - 시도해보십시오. 이 어리석은 예제의 제한된 범위를 넘어서보십시오. – shoosh