【问题标题】: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 定义为函数模板。

还有其他方法吗?

【问题讨论】:

    标签: c++ callback template-classes


    【解决方案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;
        }
        

        【讨论】:

          猜你喜欢
          • 2016-10-19
          • 1970-01-01
          • 1970-01-01
          • 2021-12-11
          • 1970-01-01
          • 1970-01-01
          • 2013-05-07
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多