类似Qt之信号槽,但是不要不要moc机制 -- C++第三方信号槽的源码实现

417 阅读1分钟

信号-槽是非常优秀的通信机制,但Qt的moc实现方式,被一些人诟病,所以他们造了新的轮子, 仿造Qt,但是without moc:

 

Verdigris:

github.com/woboq/verdi…

woboq.com/blog/verdig…

 

copperspice

github.com/copperspice…

www.copperspice.com/

 

Differences between CopperSpice and Verdigris

 Pure QtVerdigrisCopperSpice
Requires mocYesNoNo
UsageConvenient macrosUgly macrosUgly macros
Qt CompatibilityObviouslyYesNo
MetaObject generationCompile Time (By moc)Compile Time (By the compiler)Run-time (At load time)
MetaObject locationShared read-only memoryShared read-only memoryHeap

Macros

QtVerdigrisCopperSpice
Q_OBJECTW_OBJECT(MyClass) ... W_OBJECT_IMPL(MyClass)CS_OBJECT(MyClass)
public slots:    void mySlot(int x);void mySlot(int x); W_SLOT(mySlot)CS_SLOT_1(Public, void mySlot(int x)) CS_SLOT_2(mySlot)
signals:    void mySignal(int x);void mySignal(int x) W_SIGNAL(mySignal,x)CS_SIGNAL_1(Public, void mySignal(int x)) CS_SIGNAL_2(mySignal,x)
Q_PROPERTY(int myProperty    WRITE setProp    READ getProp    NOTIFY propChanged)W_PROPERTY(int, myProperty    WRITE setProp    READ getProp    NOTIFY propChanged)CS_PROPERTY_READ(myProperty, getProp) CS_PROPERTY_WRITE(myProperty, setProp) CS_PROPERTY_NOTIFY(myProperty, propertyChanged)
private slots:    myPrivateSlot(int x);void myPrivateSlot(int x); W_SLOT(myPrivateSlot, (int), W_Access::Private)CS_SLOT_1(Private, void myPrivateSlot(int x)) CS_SLOT_OVERLOAD(myPrivateSlot,(int))

 

其他第三方信号槽

gitee.com/giveda/gobj… 类似Qt的信号槽,但不需要moc;基于c++11,用于解耦合;【推荐】

github.com/NoAvailable…

github.com/pbhogan/Sig…

github.com/fr00b0/nod

仿Qt信号槽实现(高仿,三个版本)

 

property_bindings

github.com/woboq/prope…

woboq.com/blog/proper…