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.


Anmelden zum Antworten