2015-03-25 3 views
3

Рассмотрим это:Как определение типа во указатель на функцию с аргументами шаблона

typedef void (*ExecFunc)(int val); 

class Executor 
{ 

    void doStuff() { mFunc(mVal); } 
    void setFunc(ExecFunc func) { mFunc = func; } 

    int   mVal; 
    ExecFunc  mFunc; 
}; 

void addOne(int val) { val = val+1; } // this could be passed as an ExecFunc. 

Очень простой. Предположим теперь, что я хочу запланировать это?

typedef void (*ExecFunc)(int val); // what do I do with this? 

template < typename X > class Executor 
{ 

    void doStuff() { mFunc(mVal); } 
    void setFunc(ExecFunc<X> func) { mFunc = func; } 

    X    mVal; 
    ExecFunc<X>  mFunc; // err... trouble.. 
}; 

template < typename X > addOne(X val) { val += 1; } 

Так как я могу создать указатель функции templatized?

+1

определить его в классе с помощью параметра шаблона. – OMGtechy

ответ

9

В C++ 11, вы можете использовать это:

template<class X> 
using ExecFunc = void(*)(X); 

определяет ExecFunc<X>.

В C++ 03, вы должны использовать вместо этого:

template<class X> 
struct ExecFunc { 
    typedef void(*type)(X); 
}; 

и использовать typename ExecFunc<X>::type в Executor.