Funktionspointer (Boost)
-
Hallo,
ich habe ein Problem mit meinem EventManager. Schnell gesagt: Der EventManager prüft ob eine Taste gedrückt wurde. Wird eine bestimmte Taste gedrückt, soll eine Funktion ausgeführt werden. Um das alles etwas dynamischer zu machen, möchte ich eine "Registerfunktion" haben. Am Ende möchte ich das tun können:void TasteA() { std::cout<<"Sie haben A gedrueckt"; } EventManager Manager; Manager.RegisterEvent( boost::bind( TasteA ), //Funktion die ausgeführt werden soll... 65 ); //... wenn die Taste 'A' (ASCII: 65) gedrückt wurde(Code aus dem Kopf getippt, also nur ein Beispiel).
Im Grunde ganz easy, allerdings habe ich kaum Erfahrung mit der Verwendung von boost::function. In meinem Kopf habe ich es mir so gedacht:
class EventManager : boost::noncopyable { private: template <typename FuncSignature> std::map< boost::function<FuncSignature (void)>, const int > m_EventMap; void CheckIfKeyPressed( ); //Endlosschleife wo geprüft wird ob die Tastatureingabe gleich "ASCIIKeyCode" ist. Falls ja, rufe Funktionsptr auf public: template <typename FuncSignature> void RegisterEvent( boost::function<FuncSignature (void)> FuncPtr, const int ASCIIKeyCode ) { } };Natürlich geht das mit dem Template und der Membermap nicht. Allerdings weiß ich nicht wie ich das machen soll. Achja; Man soll natürlich Funktionen mit beliebigen Funktionssignaturen übergeben können, aber das kann man ja in aller Regel mit boost::bind machen, richtig?
Nochmal zusammengefasst und kurz gesagt:
Ich übergebe der Registerfunktion eine Funktion, die aufgerufen werden soll, wenn Taste XYZ gedrückt wird.Ich hoffe mir kann jemand helfen. Vielen lieben Dank im Voraus Männer!

-
Sorry wegen dem Doppelpost, aber so finde ich es übersichtlicher:
Ich habe mir nun überlegt das es ja im Prinzip reichen würde, wenn die Funktionssignatur nur einen void als Rückgabewert hätte. Also so:class EventManager : boost::noncopyable { private: std::map< boost::function<void (void)>, const int > m_EventMap; std::vector< std::vector< Chat::Conversation > > &m_Buffer; std::vector< std::vector< Chat::Conversation > >::const_iterator m_GlobalIt; void CheckIfKeyPressed( ); public: EventManager( std::vector< std::vector< Chat::Conversation > > &Buffer ); void RegisterEvent( boost::function<void (void)> FuncPtr, const int ASCIIKeyCode ) { } };Würde im Grunde doch auch schon funktionieren, oder? Allerdings wäre man dann ja so weit eingeschränkt, dass man nur void-Funktionen registrieren kann.
Bitte um Rat und Verbesserungsvorschläge! Danke!
-
Kann es ein, daß du bei der map-Definition Schlüssel und Wert vertauscht hast? Der erste Parameter (bei dir boost::function<...>) wird als Suchschlüssel verwendet und braucht deshalb eine Kleiner-Beziehung, der zweite Parameter (const int - btw, das const ist dort überflüssig) ist der zugeordnete Wert.
-
CStoll schrieb:
Kann es ein, daß du bei der map-Definition Schlüssel und Wert vertauscht hast? Der erste Parameter (bei dir boost::function<...>) wird als Suchschlüssel verwendet und braucht deshalb eine Kleiner-Beziehung, der zweite Parameter (const int - btw, das const ist dort überflüssig) ist der zugeordnete Wert.
Hey CStoll,
danke erstmal für die Antwort! Ja, du hast Recht. Muss mich irgendwie vertan haben, entschuldigung. So nun also:class EventManager : boost::noncopyable { private: std::vector< std::pair<boost::function<void (void)>, char > > m_EventMap; void CheckIfKeyPressed( ); public: void RegisterEvent( boost::function<void (void)> FuncPtr, char ASCIIKeyCode ) { m_EventMap = std::make_pair( FuncPtr, ASCIIKeyCode ); } };//EDIT: Code ist immer noch nicht richtig, wegen dem std::vector<>, allerdings geht's ja auch erstmal nur um die Grundidee.
-
Was spricht denn gegen eine map<char, function>? Schließlich willst du zu einer vorgegebenen Taste die passende Funktion ermitteln.
Ansonsten: Was genau ist eigentlich dein Problem?
-
Hey,
funktioniert jetzt. Trotzdem danke für deine Hilfe!Nächtle
