Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Lambda deregistrieren?

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
05.11.2013, 19:15 Uhr
hilefoks



Moin,

ich habe eine Klasse geschrieben an der ich Callbacks, unter anderem Lambda Ausdrücke, registrieren und de-registrieren können möchte.

Registrieren ist recht einfach, aber ich habe keine Idee wie ich einen Lambda Ausdruck wiederfinden und de-registrieren kann. Hintergrund ist, das zwei Lambda ja nicht miteinander vergleichbar sind.


C++:
typedef QSharedPointer<Message> MessagePtr;
typedef std::function<void (MessagePtr)> MessageListener;

struct MessageDispatcher
{
    virtual ~MessageDispatcher() {}

    virtual void dispatch(MessagePtr message) const = 0;
};

struct LambdaMessageDispatcher : public MessageDispatcher
{
    LambdaMessageDispatcher(MessageListener messageListener)
      : listener( messageListener )
    {
    }

    void dispatch(MessagePtr message) const
    {
        listener( message );
    }

    MessageListener listener;
};

class MessageListenerContainer
{
public:
    void subscribe(MessageListener &listener)
    {
        m_dispatcher.append( new LambdaMessageDispatcher( listener ) );
    }

    void unsubscribe(MessageListener &listener)
    {
        foreach(MessageDispatcher *dispatcher, m_dispatcher) {
            auto it = dynamic_cast<ListenerMessageDispatcher*>( dispatcher );
            if( it ) {
                // ???
            }
        }
    }

    //...

private:
    QList<MessageDispatcher*> m_dispatcher;
};



Weiß jemand, wie ich das gelöst bekomme?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
07.11.2013, 14:10 Uhr
Th



Lies dir mal die beiden Artikel unter
http://stackoverflow.com/questions/4584685/vector-of-stdfunction
http://stackoverflow.com/questions/3629835/why-is-stdfunction-not-equality-comparable
durch (evtl. findest du da einige Tipps, z.B. std::shared_ptr<>.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
08.11.2013, 10:14 Uhr
hilefoks



Danke für die Antwort.

Die Idee ist also, dem Benutzer der Klasse einen Identifier (hier einen shared_ptr) zurückzugeben, mit dessen Hilfe er die Lambda-Funktion wieder deregistrieren kann.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: