我在一个类中有 2 个函数,一个是 operator+= 的默认规范,它需要某种函数,而第二个规范需要一个 EventHandler,这是实现:
template<typename _Func>
timed_function<_Sig>& operator+=( _Func &&f )
{
// Create an unamed handler
auto handler = new EventHandler<_Sig>( "unamed", std::forward<_Func>( f ) );
// Push it
_fs.push_back( handler );
// Return a reference to the function
return handler->get( );
}
这是专门的版本:
template<>
timed_function<_Sig>& operator+=<const EventHandler<_Sig>&>( const EventHandler<_Sig> &_Handler )
{
// Copy the handler and push it
_fs.push_back( new EventHandler<_Sig>( _Handler ) );
// Return a reference to the function
return _fs.back( )->get( );
}
在哪里_fs
只是 EventHandler<_Sig>
的 vector 指针。
和 _Sig
作为函数签名(例如 void(int)
)
例如在 lambda 函数上使用 += 运算符时,它工作得很好,编译器会选择正确的特化:
window->OnKeyDown( ) += []( dx::Window *sender, dx::KeyDownArgs &args )
{
[...]
};
OnKeyDown( )
返回对 Event<void(dx::Window*, dx::KeyDownArgs&)>
实例的引用
但是,当我尝试像这样手动添加 EventHandler 时,它仍然会选择该函数的非专用版本。
window->OnKeyDown( ) += EventHandler<void(dx::Window*, dx::KeyDownArgs&)>( "Key Handler",
[]( dx::Window *sender, dx::KeyDownArgs &args )
{
[...]
} );
谢谢!
最佳答案
您提供 EventHandler<_Sig>&&
不是const EventHandler<_Sig>&
, 因此选择了非专用版本。
关于c++ - 显式函数模板特化选择了错误的特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36430402/