boost::signal: Memberfunktionen
-
Hi.
Hab am WE versucht mit boost::signals ein wenig rumzuspielen, aber so richtig schlau werd ich aus der Doku nicht. Hab jetzt libsigc++ erstmal genommen, denn da geht das so wie ich das möchte, allerdings nervt es mich, dass ich das nicht gelöst habe, deswegen frage ich euch :).
Hier erstmal ein wenig minimalster Code wie ich es mit libsigc++ gemacht habe:class EventEmitter { public: typedef sigc::signal<void, const std::string&> Signal; typedef sigc::slot<void, const std::string&> Slot; private: Signal m_event; public: sigc::connection connect(Slot& slot) { return m_event.connect(slot); } run() { m_event.emit("foobar"); } }; class EventReceiver : public sigc::trackable { public: void Event(const std::string& msg) { std::cout << "Event :" << msg << std::endl; } }; int main(int argc, char** argv) { EventEmitter emitter; EventReceiver e; emitter.connect(sigc::slot(sigc::mem_fun(&e, &EventReceiver::Event))); emitter.run(); }Ich denke man sieht, was ich möchte. Ich möchte Klassenmethoden als Event-Funktion zu registrieren. Das geht unter boost::signals anscheinend nicht..
Oder liege ich falsch?
rya.edit ps: Ich hab den Code jetzt nicht getestet, könnte evtl ein Flüchtigkeits-Fehler drin sein, aber er zeigt wo ich hin wil...
-
Scorcher24 schrieb:
Das geht unter boost::signals anscheinend nicht..
Oder liege ich falsch?
Natürlich

Ich denke, was du suchst ist boost::bind. Dein Beispiel würde dann in etwa so aussehen:
#include <iostream> #include <boost/signals.hpp> #include <boost/bind.hpp> class EventEmitter { public: typedef boost::signal<void (std::string const &)> Signal; private: Signal m_event; public: boost::signals::connection connect(Signal::slot_type slot) { return m_event.connect(slot); } void run() { m_event("foobar"); } }; class EventReceiver { public: void Event(const std::string& msg) { std::cout << "Event :" << msg << std::endl; } }; int main(int argc, char** argv) { EventEmitter emitter; EventReceiver e; emitter.connect(boost::bind(&EventReceiver::Event, e, _1)); emitter.run(); }
-
Danke!

rya.