我使用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? */ >
{
//...
};
编辑:
澄清 - 我不想要一个特定的功能代替/* 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
未在此范围内声明。
答案 0 :(得分:4)
您将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 >
{
//...
};