Ich habe 2 Funktionen innerhalb einer Klasse, eine ist die Standard-Spezialisierung des Operators + =, die eine Funktion irgendeiner Art erwartet, während die zweite Spezialisierung einen EventHandler erwartet, hier ist die Implementierung:Explizite Funktion Template-Spezialisierung wählt die falsche Spezialisierung
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();
}
Hier ist die spezielle Version:
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();
}
Wo _fs
nur ein Vektor von EventHandler<_Sig>
Pointers ist. Und _Sig
ist die Funktion Signatur (zB void(int)
)
Wenn der Bediener mit Hilfe von + = zum Beispiel arbeitet eine Lambda-Funktion ist es ganz gut und der Compiler wählt die richtige Spezialisierung:
window->OnKeyDown() += [](dx::Window *sender, dx::KeyDownArgs &args)
{
[...]
};
OnKeyDown()
gibt einen Verweis zu einer Instanz von Event<void(dx::Window*, dx::KeyDownArgs&)>
Wenn ich jedoch versuche, manuell einen EventHandler wie folgt hinzuzufügen, wählt er trotzdem die nicht spezialisierte Version der Funktion.
window->OnKeyDown() += EventHandler<void(dx::Window*, dx::KeyDownArgs&)>("Key Handler",
[](dx::Window *sender, dx::KeyDownArgs &args)
{
[...]
});
Vielen Dank!
'dx :: EventHandler' ist das gleiche wie' EventHandler'? – SergeyA
Ja, ich werde es entfernen, damit es leichter zu verstehen ist, danke. – PsychoBitch