Wie und warum würde man Boost-Signale2 verwenden?

Lernen Sie c ++ und versuchen Sie, sich mit einigen Mustern vertraut zu machen. Dassignals2 doc Ich kann natürlich eine Vielzahl von Dingen mit Slots und Signalen tun. Was ich nicht verstehe, ist, für welche Arten von Anwendungen (Anwendungsfälle) ich es verwenden sollte.

Ich denke nach dem Vorbild einer Zustandsmaschine, die Änderungsereignisse auslöst. Ausgehend von einem dynamisch getippten Hintergrund (C #, Java usw.) würden Sie einen Event-Dispatcher oder eine statische Referenz oder einen Rückruf verwenden.

Gibt es in C ++ Schwierigkeiten bei der Verwendung von klassenübergreifenden Rückrufen? Ist das im WesentlichenWarum signals2 existiert?

Einer der Beispielfälle ist ein Dokument / eine Ansicht. Wie ist dieses Muster besser geeignet, als beispielsweise einen Vektor von Funktionen zu verwenden und jede Funktion in einer Schleife aufzurufen, oder ein Lambda, das Zustandsänderungen in registrierten Listening-Klasseninstanzen aufruft?

class Document
{
public:
    typedef boost::signals2::signal<void ()>  signal_t;

public:
    Document()
    {}

    /* Connect a slot to the signal which will be emitted whenever
      text is appended to the document. */
    boost::signals2::connection connect(const signal_t::slot_type &subscriber)
    {
        return m_sig.connect(subscriber);
    }

    void append(const char* s)
    {
        m_text += s;
        m_sig();
    }

    const std::string& getText() const
    {
        return m_text;
    }

private:
    signal_t    m_sig;
    std::string m_text;
};

und

class TextView
{
public:
    TextView(Document& doc): m_document(doc)
    {
        m_connection = m_document.connect(boost::bind(&TextView::refresh, this));
    }

    ~TextView()
    {
        m_connection.disconnect();
    }

    void refresh() const
    {
        std::cout << "TextView: " << m_document.getText() << std::endl;
    }
private:
    Document&               m_document;
    boost::signals2::connection  m_connection;
};

Antworten auf die Frage(1)

Ihre Antwort auf die Frage