Нужно прекратить дальнейшее выполнение слотов по коду возврата текущей функции-слота. Прервать сигналирование.
Как это осуществить, подскажите.
Здравствуйте, Аноним, Вы писали:
А>Нужно прекратить дальнейшее выполнение слотов по коду возврата текущей функции-слота. Прервать сигналирование.
А>Как это осуществить, подскажите.
Бросить исключение из слота и поймать его на выходе из сигнала?
Здравствуйте, 0xDEADBEEF, Вы писали:
DEA>Здравствуйте, Аноним, Вы писали:
А>>Нужно прекратить дальнейшее выполнение слотов по коду возврата текущей функции-слота. Прервать сигналирование.
А>>Как это осуществить, подскажите.
DEA>Бросить исключение из слота и поймать его на выходе из сигнала?
И каждый клиент должен включать выброс исключения в свой код? Не подходит.
Здравствуйте, Аноним, Вы писали:
А>>>Нужно прекратить дальнейшее выполнение слотов по коду возврата текущей функции-слота. Прервать сигналирование.
А>>>Как это осуществить, подскажите.
DEA>>Бросить исключение из слота и поймать его на выходе из сигнала?
А>И каждый клиент должен включать выброс исключения в свой код? Не подходит.
...Это если думать спинным мозгом. А если думать мозгом головным, то подходит.
Пример:
//пользователь вызывает только эту функцию для вызова сигнала.
void invoke_signal(args...)
{
try {
my_signal(args...);//my_signal недоступен из пользовательского кода
} catch(cancel_signal) {
//если мы здесь, кто-то обломил наш сигнал
}
}
Здравствуйте, Аноним, Вы писали:
А>Нужно прекратить дальнейшее выполнение слотов по коду возврата текущей функции-слота. Прервать сигналирование.
А>Как это осуществить, подскажите.
Использовать свой combiner:
// Execute signal handlers until one of them returns 'true'.
// Result is 'true' if some handler returns 'true' and 'false' otherwise.
// If there are no handlers, result is 'false'.
template<typename T>
struct until_true {
typedef bool result_type;
template <typename InputIterator>
bool operator()(InputIterator first, InputIterator last) const {
while (first != last) {
if (*first == true)
return true;
++first;
}
return false;
}
};
boost::signal<bool (int), until_true> signal;
Здравствуйте, Elifant, Вы писали:
E>Здравствуйте, Аноним, Вы писали:
А>>Нужно прекратить дальнейшее выполнение слотов по коду возврата текущей функции-слота. Прервать сигналирование.
А>>Как это осуществить, подскажите.
E>Использовать свой combiner:
Это я уже собразил, спасибо. А теперь самое главное: как из комбайна достать параметры сигнала?