Как добиться QT-подобного синтаксиса сигнальных соединений с Boost :: Signal - PullRequest
4 голосов
/ 17 февраля 2010

В QT мы можем соединять сигналы и слоты, используя следующий простой синтаксис:

connect(pObject1, signal1, pObject2, slot2)

Например, можно написать что-то вроде:

A a;
B b;    
connect(&a, SIGNAL(valueChanged(int)), &a, SLOT(setValue(int)));

С Boost :: Signal синтаксис мы бы написали так:

A a;
B b;    
a.valueChanged.connect(boost::bind(&B::SetValue, &b, _1))

ИМХО, синтаксис сигнала наддува более сложный. Есть ли способ сделать синтаксис Boost :: Signal более похожим на QT.

1 Ответ

4 голосов
/ 17 февраля 2010

Дело в том, что Qt проходит фазу генерации кода во время компиляции, чего не может сделать Boost. Это означает, что Qt может делать очень умные синтаксические вещи, которые нельзя скопировать, не пройдя аналогичный процесс.

Цитировать Википедия :

Этот инструмент, известный как moc, запускается на источниках программы Qt. Он интерпретирует определенные макросы из кода C ++ как аннотации и использует их для генерации дополнительного кода C ++ с «метаинформацией» о классах, используемых в программе. Эта метаинформация используется Qt для предоставления функций программирования, недоступных изначально в C ++: система сигналов / слотов, самоанализ и асинхронные вызовы функций.

(я не могу заставить ссылку работать, но это http://en.wikipedia.org/wiki/Qt_(framework))

Редактировать: Я думаю, что цитата из Википедии совершенно ясна, что система сигнал / слот реализована с использованием moc. Я очень сомневаюсь, что есть какой-либо способ использовать тот же синтаксис без использования подобной системы.

...