Gibt es eine Möglichkeit, einen Boost :: Signal davon abzuhalten, seine Slots aufzurufen, wenn einer von ihnen wahr zurückgibt?

StackOverflow https://stackoverflow.com/questions/2009605

Frage

Ich benutze die Boost -Bibliothek und meine Frage handelt von Boost :: Signalen.
Ich habe ein Signal, das viele verschiedene Slots nennen könnte, aber nur ein Steckplatz entspricht dem Anruf. Ich möchte, dass dieser bestimmte Steckplatz wieder auftret und der Anruf aufhört.
Ist es möglich?
Ist es effizient?
Könnt ihr mir einen besseren Weg vorschlagen, wenn es nicht effizient ist?

War es hilfreich?

Lösung

Nach einigen Nachforschungen habe ich festgestellt, dass sie in Boost -Dokumentation schreiben, über die sie schreiben Slots, die Werte zurückgeben.
Sie schlagen vor, einen anderen Kombinierer wie diesen zu verwenden:

struct breakIfTrue
{
  template<typename InputIterator>
  bool operator()(InputIterator first, InputIterator last) const
  {
    if (first == last)
      return false;

    while (first != last) {
      if (*first)
        return true;
      ++first;
    }
  }
};

boost::signal<bool(), breakIfTrue> sig;

Warum ist das das Falsche zu tun?

Andere Tipps

Es kann zwar möglich sein, aber es steht sicherlich der Absicht von Signalen und Slots "generische Veröffentlichungen/Abonnieren".

Ich denke, was Sie wirklich suchen, ist das Verantwortungskette Designmuster.

Wie Drew sagt, klingt dies nicht anhand von Signalen und Slots.

Und wie bei Dribeas sagt, ist eine Problemumgehung ein Protokoll mit a bool& found Parameter, der falsch beginnt, wobei jeder Slot am Start überprüft wird und zurückgibt, wenn es wahr ist. Wenn ein Steckplatz den Wert auf True festlegt, wird die Bearbeitung der anderen Anrufe sehr schnell erfolgen.

Aber nur um alle Grundlagen (sogar die unangemessenen) abzudecken, werde ich erwähnen, dass Boost :: Signale sind Alle werden auf demselben Thread wie der Anrufer ausgeführt Sie könnte Werfen Sie eine benutzerdefinierte Ausnahme aus dem Signal und fangen Sie sie dann an der Anrufseite. Zum Guten oder Schlechten greifen die Menschen gelegentlich darauf zurück, wenn sie das Gefühl haben, keine andere Option zu haben ... wie während der Besucheralgorithmen in der Boost -Graph -Bibliothek:

Wie stoppe ich die Breite, die die Breite mit der Boost-Grafikbibliothek mit einem benutzerdefinierten Besucher mithilfe eines benutzerdefinierten Besucheres beendet?

Und jetzt, wo ich es erwähnt habe, mach es nicht so. :)

AKTUALISIEREN: Ich wusste es nicht, aber Sie haben festgestellt Iteratoren und keine Ergebniswerte:

"Die Eingabe -Iteratoren übergeben an die Combiner -Transformation Dereference -Operationen in Schlitzaufrufe. Die Kombinationen haben daher die Möglichkeit, nur einige Slots aufzurufen, bis ein bestimmtes Kriterium erfüllt ist."

Wenn Sie sicher sind, dass Sie an Boost bleiben, haben Sie Ihre eigene Frage beantwortet, da dies das tut, was Sie wollen. Beachten Sie jedoch, dass andere Signal-/Schlitzsysteme (wie QTs) keine Parallele zu diesem ...

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top