将函数模板定义为类模板的回调

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&lt;std::string&gt; 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;

【讨论】:

以上是关于将函数模板定义为类模板的回调的主要内容,如果未能解决你的问题,请参考以下文章

C++ 为类模板提供初始化列表构造函数

带有回调函数的 C++ 模板类

如何将模板定义转换为类

通过 Angular 模板传递回调函数时保留此上下文

C++模板类使用

类模板,链表,直接插入排序,选择排序,起泡排序