Определение шаблона функции в качестве обратного вызова для шаблона класса

Я хочу определить шаблон класса, который принимает функцию обратного вызова того же типа. Что-то вроде:

    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 );
}
3

Другие решения

Переместите 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; в вашем примере.

2

Я сделал некоторые изменения.

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;
}
1
По вопросам рекламы [email protected]