我正在使用 FLTK 来做与 GUI 相关的事情,它需要类型为 void (*fn)( Fl_Widget*, void* )
的函数注册为小部件回调。我厌倦了手动创建将 void*
解压缩为参数并从我的类中调用适当的静态函数来完成用户请求的工作的函数转发器。
我想出了一个解决方案,但它需要一个专门用于函数类型和函数地址的类,这就是我遇到问题的地方。这是一些代码:
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? */ >
{
//...
};
编辑:
澄清一下——我不想用一个特定的函数来代替 /* 这里有什么? */
,但我希望此参数为 Return (*fn_ptr)( Params... )
。当我尝试
template< typename T, typename Return, typename... Params >
struct Fl_Callback_package< T, Return (*)( Params... ), Return (*fn_ptr)( Params... ) >
我收到 GCC 4.8.1 的错误消息,指出 fn_ptr
未在此范围内声明。
最佳答案
你把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 >
{
//...
};
关于c++ - 函数指针类型和值的部分类特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28792422/