将函数模板定义为类模板的回调
Posted
技术标签:
【中文标题】将函数模板定义为类模板的回调【英文标题】:Defining a function template as a callback for a class template 【发布时间】:2012-11-28 14:32:27 【问题描述】:我想定义一个类模板,它采用相同类型的回调函数。比如:
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
定义为函数模板。
还有其他方法吗?
【问题讨论】:
【参考方案1】:#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】:像这样在类中移动 typedef:
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;
。
【讨论】:
【参考方案3】:我做了一些改变。
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;
【讨论】:
以上是关于将函数模板定义为类模板的回调的主要内容,如果未能解决你的问题,请参考以下文章