函数指针类型和值的部分 class 特化
Partial class specialization for function pointer type and value
我正在使用 FLTK 来做与 GUI 相关的事情,它需要 void (*fn)( Fl_Widget*, void* )
类型的函数注册为小部件回调。我厌倦了手动创建将 void*
解压缩为参数并从我的 class 中调用适当的静态函数来完成用户请求的工作的函数转发器。
我想出了一个解决方案,但它需要一个 class 专门用于函数类型和函数地址,这就是我遇到问题的地方。这是一些代码:
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? */ >
{
//...
};
编辑:
澄清一下——我不想用特定函数代替 /* 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 >
{
//...
};
我正在使用 FLTK 来做与 GUI 相关的事情,它需要 void (*fn)( Fl_Widget*, void* )
类型的函数注册为小部件回调。我厌倦了手动创建将 void*
解压缩为参数并从我的 class 中调用适当的静态函数来完成用户请求的工作的函数转发器。
我想出了一个解决方案,但它需要一个 class 专门用于函数类型和函数地址,这就是我遇到问题的地方。这是一些代码:
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? */ >
{
//...
};
编辑:
澄清一下——我不想用特定函数代替 /* 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 >
{
//...
};