如何使用模板参数键入一个函数指针

Raf*_*sta 7 c++ templates function-pointers

考虑一下:

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. 
Run Code Online (Sandbox Code Playgroud)

非常简单.假设我现在要模板化这个?

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; }
Run Code Online (Sandbox Code Playgroud)

那么如何创建一个模板化的函数指针呢?

Yak*_*ont 16

在C++ 11中,您可以使用:

template<class X>
using ExecFunc = void(*)(X);
Run Code Online (Sandbox Code Playgroud)

定义ExecFunc<X>.

在C++ 03中,你必须使用它:

template<class X>
struct ExecFunc {
  typedef void(*type)(X);
};
Run Code Online (Sandbox Code Playgroud)

typename ExecFunc<X>::type在内部使用Executor.