шаблонный указатель на функцию - PullRequest
3 голосов
/ 16 сентября 2010

У меня есть подход к вызову отложенной функции для класса:

//in MyClass declaration:
typedef void (MyClass::*IntFunc) (int value);
void DelayedFunction (IntFunc func, int value, float time);
class TFunctorInt
{
public:
    TFunctorInt (MyClass* o, IntFunc f, int v) : obj (o), func (f), value (v) {}
    virtual void operator()();
protected:
    MyClass* obj;
    IntFunc func;
    int value;
};
//in MyClass.cpp file:
void MyClass::DelayedFunction (IntFunc func, int value, float time)
{
    TFunctorBase* functor = new TFunctorInt (this, func, value);
    DelayedFunctions.push_back (TDelayedFunction (functor, time)); // will be called in future
}
void MyClass::TFunctorInt::operator()()
{
    ((*obj).*(func)) (value);
}

Я хочу сделать шаблонный функтор.И первая проблема заключается в том, что:

template <typename T>
typedef void (MyClass::*TFunc<T>) (T param);

Вызывает ошибку компилятора: «объявление шаблона typedef».В чем может быть решение?

PS: код на основе http://www.coffeedev.net/c++-faq-lite/en/pointers-to-members.html#faq-33.5

1 Ответ

10 голосов
/ 16 сентября 2010

В C ++ нет шаблонов typedefs. Есть такое расширение в C ++ 0x. А пока делай

template <typename T>
struct TFunc
{
    typedef void (MyClass::*type)(T param);
};

и используйте TFunc<T>::type (с префиксом typename если в зависимом контексте) всякий раз, когда вы использовали бы TFunc<T>.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...