Есть ли способ остановить повышение :: сигнал от вызова своих слотов, если один из них возвращает истину? - PullRequest
2 голосов
/ 06 января 2010

Я использую библиотеку наддува, и мой вопрос касается boost :: сигналов.
У меня есть сигнал, который может вызывать много разных слотов, но только один слот будет соответствовать вызову, поэтому я хочу, чтобы этот конкретный слот возвратил true, и что вызов прекратится. Возможно ли это?
Это эффективно?
Ребята, можете ли вы предложить мне лучший способ сделать это, если это не эффективно?

Ответы [ 3 ]

6 голосов
/ 06 января 2010

После некоторых исследований я обнаружил, что в документации повышения они пишут о слотах, которые возвращают значения .
Они предлагают использовать другой сумматор, как это:

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;

Теперь, почему это неправильно?

3 голосов
/ 06 января 2010

Несмотря на то, что это возможно, это, безусловно, противоречит намерению «общие публикации / подписки» сигналов и слотов.

Я думаю, что вы действительно ищете, это Цепочка ответственности шаблон проектирования.

2 голосов
/ 06 января 2010

Как говорит Дрю, это не похоже на сигналы и слоты.

И, как говорит dribeas, обходной путь - это протокол с параметром bool& found, который начинается с false, при этом каждый слот проверяется в начале и возвращает значение true. Если в каком-либо слоте установлено значение true, обработка других вызовов будет происходить очень быстро.

Но для того, чтобы охватить все базы (даже нежелательные), я упомяну, что поскольку сигналы boost :: все работают в том же потоке, что и вызывающий , вы могли бы генерировать пользовательское исключение из сигнала, а затем ловить его на сайте вызова. Что бы там ни было, люди иногда прибегают к этому, когда чувствуют, что у них нет другого выбора ... как во время алгоритмов посетителей в библиотеке графов наддува:

Как остановить поиск в ширину с помощью библиотеки графиков повышения при использовании пользовательского посетителя?

И теперь, когда я это упомянул, не делайте так. :)

ОБНОВЛЕНИЕ: Не знал, но вы обнаружили, что в Boost есть механизм для элегантной обработки этого с помощью сумматоров, которые принимают итераторов , а не значений результата:

"Итераторы ввода, переданные комбинатору, преобразуют операции разыменования в вызовы слотов. Поэтому комбинаторы имеют возможность вызывать только некоторые слоты, пока не будет удовлетворен какой-то конкретный критерий."

Если вы уверены, что придерживаетесь наддува, то вы ответили на свой вопрос, потому что он делает то, что вы хотите. Хотя обратите внимание, что другие системы сигналов / слотов (например, Qt) не будут иметь параллели с этим ...

...