Boost.Signals позволяет различные стратегии использования возвращаемых значений слотов для формирования возвращаемого значения сигнала. Например, добавляя их, формируя из них вектор
или возвращая последний.
Распространенная мудрость (выраженная в документации Qt [EDIT: ], а также некоторые ответы на этот вопрос ] ) заключается в том, что это невозможно с сигналами Qt.
Однако, когда я запускаю moc для следующего определения класса:
class Object : public QObject {
Q_OBJECT
public:
explicit Object( QObject * parent=0 )
: QObject( parent ) {}
public Q_SLOTS:
void voidSlot();
int intSlot();
Q_SIGNALS:
void voidSignal();
int intSignal();
};
Не только moc не жалуется на сигнал с типом возврата non-void, похоже, он активно реализует его таким образом, чтобы разрешить передать возвращаемое значение:
// SIGNAL 1
int Object::intSignal()
{
int _t0;
void *_a[] = { const_cast(reinterpret_cast(&_t0)) };
QMetaObject::activate(this, &staticMetaObject, 1, _a);
return _t0;
}
Итак: согласно документации, это невозможно. Тогда что здесь делает moc?
Слоты могут иметь возвращаемые значения , поэтому можем ли мы теперь соединить слот с возвращаемым значением с сигналом с возвращаемым значением? В конце концов, такое ли возможно? Если да, то насколько это полезно?
РЕДАКТИРОВАТЬ: Я не прошу обходных путей, поэтому, пожалуйста, не предоставляйте их.
РЕДАКТИРОВАТЬ: Очевидно, что это бесполезно в Qt :: QueuedConnection
режим (впрочем, как и QPrintPreviewWidget API , он все еще существует и полезен). Но как насчет Qt :: DirectConnection
и Qt :: BlockingQueuedConnection
(или Qt :: AutoConnection
, когда он разрешается в Qt :: DirectConnection
]).