クラス内に2つの関数があります。1つはオペレータのデフォルトのspec +です。何らかの関数を期待しています.2番目のspecilizationは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();
}
は、ここで特殊なバージョンです:_fs
はEventHandler<_Sig>
ポインタの単なるベクトルである
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();
}
。 そして_Sig
関数シグネチャ(例えばvoid(int)
)
例えばラムダ関数に+ =演算子を使用する場合、それはうまく動作し、コンパイラが正しい専門選ぶこと:
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)
{
[...]
});
ありがとうございます!
'dx :: EventHandler'は' EventHandler'と同じですか? – SergeyA
はい、理解しやすくするために削除します。ありがとうございます。 – PsychoBitch