C++ 信号/插槽概念和模板。。。选择?

C++ 信号/插槽概念和模板。。。选择?,c++,qt,signals-slots,C++,Qt,Signals Slots,使用Qt我越来越讨厌它了。QT不允许我在大多数类中使用模板,因为在C++的实际代码生成之前运行MOC编译器(或更好的预处理器)。 Qt的内部信号/插槽概念是否有合理的替代方案?我读过boost::signals2,但无法确定它是否经过预处理。请查看。它非常类似于Qt信号/插槽语法,是纯C++: class Switch { public: signal0<> Clicked; }; class Light : public has_slots<> { publi

使用Qt我越来越讨厌它了。QT不允许我在大多数类中使用模板,因为在C++的实际代码生成之前运行MOC编译器(或更好的预处理器)。 Qt的内部信号/插槽概念是否有合理的替代方案?我读过boost::signals2,但无法确定它是否经过预处理。

请查看。它非常类似于Qt信号/插槽语法,是纯C++:

class Switch
{
public:
    signal0<> Clicked;
};

class Light : public has_slots<>
{
public:
    void ToggleState();
};

Switch sw;
Light light;

sw.Clicked.connect(&light, &Light::ToggleState);
类开关
{
公众:
点击信号0;
};
类灯:公共有\u插槽
{
公众:
void ToggleState();
};
开关开关;
光;
sw.Clicked.connect(&light,&light::ToggleState);

QT不允许我在大多数类中使用模板,因为在C++的实际代码生成之前运行MOC编译器(或更好的预处理器)。 您可以将模板类用于qt信号插槽,但用于下一个restircions:

  • 模板类必须从QObject中继承
  • Q_对象宏不能在模板类中使用
  • 不能在此类中定义信号和插槽-所有信号和插槽必须在父类中
  • 您可以在中看到的实现示例

    Qt的内部信号/插槽概念是否有合理的替代方案

    如果您只需要将模拟用于Qt::DirectConnection,则任何实现(例如)都是合适的。如果您还需要Qt::QueuedConnection,我不知道没有使用其他代码的直接模拟。例如,Qt::QueuedConnection可以通过boost::signals和boost::asio对象实现

    我读过boost::signals2,但无法确定它是否经过预处理

    正如我理解你的问题,boost信号的预处理需要变量模板(如果不支持的话)。发件人:

    #ifdef BOOST_NO_VARIADIC_模板
    #包括
    #否则
    #包括
    #恩迪夫
    
    BooSt.StulalS2是一个纯C++解决方案,没有预处理/预编译/其他类似的东西。我甚至在Qt旁边使用过它,而且效果很好。我最终得到了用于GUI的Qt信号和用于内部逻辑的Boost信号。您能提供确切的情况吗?您需要从QObject获得模板+继承吗?在大多数情况下,可能会有一些很好的解决办法。例如,如果不是插槽,您可以使用模板方法。另外,看一看。
    #ifdef BOOST_NO_VARIADIC_TEMPLATES
    #include <boost/signals2/preprocessed_signal.hpp>
    #else
    #include <boost/signals2/variadic_signal.hpp>
    #endif