函数指针类型和值的部分类特化

tsu*_*uki 2 c++ templates function-pointers template-meta-programming c++11

我正在使用 FLTK 来做我的 GUI 相关的事情,它需要将类型的函数void (*fn)( Fl_Widget*, void* )注册为小部件回调。我厌倦了手动创建函数转发器,将void*s解包为参数并从我的类中调用适当的静态函数来完成用户请求的工作。

我想出了一个解决方案,但它需要一个专用于函数类型和函数地址的类,这就是我遇到问题的地方。这是一些代码:

template< typename T, typename fn_ptr_t, fn_ptr_t fn_ptr >
struct Fl_Callback_package;

template< typename T, typename Return, typename... Params >
struct Fl_Callback_package< T, Return (*)( Params... ), /* What goes here? */ >
{
  //...
};
Run Code Online (Sandbox Code Playgroud)

编辑:澄清一下 - 我不想要一个特定的函数来代替/* What goes here? */,而是我希望这个参数是Return (*fn_ptr)( Params... ). 当我尝试

template< typename T, typename Return, typename... Params >
struct Fl_Callback_package< T, Return (*)( Params... ), Return (*fn_ptr)( Params... ) >
Run Code Online (Sandbox Code Playgroud)

我从 GCC 4.8.1 收到一个错误,说它fn_ptr没有在这个范围内声明。

T.C*_*.C. 5

你放Return (*fn_ptr)( Params... )错地方了。它是部分特化的模板参数,所以它进入template <...>.

template< typename T, typename fn_ptr_t, fn_ptr_t fn_ptr >
struct Fl_Callback_package;

template< typename T, typename Return, typename... Params, Return (*fn_ptr)( Params... ) >
struct Fl_Callback_package< T, Return (*)( Params... ), fn_ptr >
{
  //...
};
Run Code Online (Sandbox Code Playgroud)