Qt не позволяет мне использовать шаблоны в большинстве своих классов, так как MOC компилятора (или лучше препроцессора) выполняется до фактического кода происходит генерация C++.
Вы можете использовать классы шаблонов с Qt сигналов-слотов, но со следующими restircions:
- Шаблон класс должен быть унаследовал от QObject
- Q_OBJECT макрос не может быть использован в шаблон класса
- Вы не можете определить сигналы и слоты в этом классе - все сигналы и слоты должны быть в родительском классе.
Пример внедрения вы можете увидеть в header for QFutureWatcher class.
Есть ли разумная альтернатива концепции внутреннего Sing/Slot Qt?
Если вам нужно использовать аналоговый только для Qt :: DirectConnection, любая реализация от, например, here подходит. Если вам нужен Qt :: QueuedConnection, я не знаю прямых аналогов без использования дополнительного кода. Например, Qt :: QueuedConnection может быть реализован через объекты boost :: signals и boost :: asio.
Я прочитал о boost :: signals2, но не смог узнать, предварительно ли он обработан или нет.
Как я понимаю, вопрос, требующий предварительной обработки сигналов форсирования, требует, если не поддерживается вариационных шаблонов. От boost signal.hpp file:
#ifdef BOOST_NO_VARIADIC_TEMPLATES
#include <boost/signals2/preprocessed_signal.hpp>
#else
#include <boost/signals2/variadic_signal.hpp>
#endif
Boost.Signals2 является раствор чистого C++, без предварительной обработки/прекомпиляция/другие такие вещи. Я даже использовал его вместе с Qt, и он работает отлично. Я закончил с Qt-сигналами для GUI-файлов и сигналов Boost для внутренней логики. – Angew
Не могли бы вы предоставить точную ситуацию, где вам нужны шаблоны + наследование от QObject? В большинстве случаев возможны довольно обходные пути. Например, вы можете использовать методы шаблонов, если они не являются слотами. –
Возможно [это может помочь] (http://doc.qt.digia.com/qq/qq15-academic.html). Кроме того, взгляните на [это] (http://stackoverflow.com/questions/26950718/how-to-use-templates-with-qt-signals-and-slots). –