2012-11-28 3 views
1

동일한 유형의 콜백 함수를 사용하는 클래스 템플릿을 정의하려고합니다. 같은 뭔가 :클래스 템플릿에 대한 콜백 함수 템플릿 정의

typedef template<class T> bool CallbackFn(T x); 

    template<class T> class MyClass 
    { 
    public: 
     MyClass() {} 
     ~MyClass() {} 
     void addCallbackFn(CallbackFn* fn) { callbackFn = fn; } 
    private: 
     CallbackFn* callbackFn; 
    }; 

그리고 그것은 다음과 같이 사용됩니다 :

bool testFunctionInt(int x) { return true; } 
    bool testFunctionString(std::string x) { return true; } 

    MyClass<int> a; 
    a.addCallbackFn(testFunctionInt); 

    MyClass<std::string> b; 
    b.addCallbackFn(testFunctionString); 

불행하게도 콜백 기능이 typedef를 통해 기능 템플릿으로 정의 할 수 없습니다.

다른 방법이 있습니까?

답변

3
#include <string> 

template <typename T> 
class MyClass { 
    public: 
    typedef bool CallbackFn(T x); 

    MyClass() : cb_(NULL) {} 
    ~MyClass() {} 

    void addCallbackFn(CallbackFn *fn) { cb_ = fn; } 

    private: 
    CallbackFn *cb_; 
}; 

static bool testFunctionInt(int x) { return true; } 
static bool testFunctionString(std::string x) { return true; } 

int main() 
{ 
    MyClass<int> a; 
    a.addCallbackFn(testFunctionInt); 

    MyClass<std::string> b; 
    b.addCallbackFn(testFunctionString); 
} 
2
이 같은 클래스의 내부 타입 정의를 이동

: 나는 믿고있어

template<class T> class MyClass 
{ 
public: 
    MyClass() {} 
    ~MyClass() {} 
    typedef bool CallbackFn(typename T x); 
    void addCallbackFn(CallbackFn* fn) { callbackFn = fn; } 

    //you could also do this 
    typedef bool (*CallbackFnPtr)(typename T x); 
    void addCallbackFnPtr(CallbackFnPtr fn) { callbackFn = fn; } 

private: 
    CallbackFn* callbackFn; //or CallbackFnPtr callbackFn; 
}; 

당신은 당신의 예에서 MyClass<std::string> b;을 의미했다.

1

일부 변경했습니다.

template<class T> 
class MyClass 
{ 

public: 
    typedef bool (*CallbackFn)(T x); 

    MyClass() {} 
    ~MyClass() {} 
    void addCallbackFn(CallbackFn fn) { callbackFn = fn; } 
private: 
    CallbackFn callbackFn; 
}; 

bool testFunctionInt(int x) 
{ 
    return true; 
} 

int main(int argc, char * argv[]) 
{ 

    MyClass<int> c; 
    c.addCallbackFn(testFunctionInt); 
    return 0; 
} 
+0

간단한 해결책을 알려 주셔서 감사합니다. – jensph

관련 문제