ich derzeit versuche zu implementieren ein Messenger-System für meine Spiel-Engine verwenden. Es nutzt Funktion Rückrufe der Form:Wie std :: bind für das Hinzufügen von Mitglied Rückruf zu einem Messenger-System
typedef std::function<void(const Message &)> Callback;
ich alle Objekte auf eine Nachricht eines bestimmten Typs abonnieren können, wollen (wo der Typ ist nur ein String). Subskribieren bedeutet das Hinzufügen ihrer "onEvent" -Funktion zum Wörterbuch der Rückrufe.
mutable std::map<std::string, std::vector<Callback>> callbackDictionary;
Die Update-Funktion dann diese Funktionen aufruft und die entsprechende Meldung (aus dem die „onEvent“ -Funktionen ihre Daten bekommen kann)
for each (auto message in messageList)
{
// find the list of respective callbacks
auto it = callbackDictionary.find(message->GetType());
// If there are callbacks registered for this message type
if (it != callbackDictionary.end())
{
// call every registred callback with the appropreate message
for each (auto callback in it->second)
callback(*message);
}
}
Nun, mein Problem ist, dass ich bin nicht ganz sicher, wie man diese "onEvent" -Funktionen bindet. Ich habe gerade vor kurzem wechselte zu C++ 11 und das Konzept der Funktionsobjekte und std::bind
ist ganz neu für mich. Also hier ist das, was ich versucht habe:
messageBus.Subscribe("Message/Click",std::bind(&ClickableComponent::OnClick, this));
wo die ClickableComponent::OnClick
Funktion die erforderliche Signatur hat:
void OnClick(const Message &);
und die Subscribe-Funktion fügt nur die übergebene Funktion zum Wörterbuch
void Messenger::Subscribe(std::string type, Callback callbackFunction) const
{
callbackDictionary[type].push_back(callbackFunction);
}
(Die push_back wird verwendet, weil es ein Vektor der Rückrufe für jede Art ist)
Der Code scheint mir gut, aber die Zeile:
messageBus.Subscribe("Message/Click", std::bind(&ClickableComponent::OnClick, this));
gibt mir den Fehler: picture of the error discription
ich alle möglichen Dinge versucht haben, wie die Messenger Referenz Spedition und Platzhalter verwenden, aber ich habe das Gefühl, dass ich etwas anderes falsch mache. Auch, bessere Idee auf, wie man dieses Botensystem einführt, werden geschätzt ^^
Danke für Ihre Hilfe!
eine Lambda-Funktion statt 'std :: bind' verwenden. – user0042
Verwenden Sie nicht 'für jedes..in' ist es eine Nicht-Standard-Erweiterung und nicht mehr nützlich. Verwende 'for (auto x: xs) {}'. –