Boost.Signals позволяет различные стратегии используя возвращаемые значения слотов для формирования возвращаемого значения сигнала. Например. добавляя их, формируя из них vector
или возвращая последний.
Общая мудрость (выраженная в документации 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 не жалуется на сигнал с типом не-void return, он, как представляется, активно реализует его таким образом, чтобы разрешить возвращаемое значение:
// SIGNAL 1
int Object::intSignal()
{
int _t0;
void *_a[] = { const_cast<void*>(reinterpret_cast<const void*>(&_t0)) };
QMetaObject::activate(this, &staticMetaObject, 1, _a);
return _t0;
}
Итак: согласно документам, эта вещь невозможна. Тогда что делает moc здесь?
Слоты могут иметь возвращаемые значения, поэтому мы можем подключить слот с возвращаемым значением к сигналу с возвращаемым значением сейчас? Может быть, это возможно, в конце концов? Если это так, полезно ли это?
EDIT: Я не прошу об обходах, поэтому, пожалуйста, не указывайте.
РЕДАКТИРОВАТЬ: Это явно не полезно в режиме Qt::QueuedConnection
(также нет QPrintPreviewWidget API, но все же он существует и полезен). Но как насчет Qt::DirectConnection
и Qt::BlockingQueuedConnection
(или Qt::AutoConnection
, когда он разрешает Qt::DirectConnection
).