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

これを行う別の方法はありますか?

4

3 に答える 3

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 );
}
于 2012-11-28T14:43:20.953 に答える
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;があなたの例で意味したと仮定しています。

于 2012-11-28T14:43:12.973 に答える
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;
}
于 2012-11-28T14:46:52.893 に答える