栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

纯C++实现信号槽

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

纯C++实现信号槽

前言

通过纯C++代码编写类似QT的信号槽功能。其实就是观察者模式。

#include 
#include 

using namespace std;


template 
class SlotBase
{
public:
    virtual void slotFunction(TParam param) = 0;
    ~SlotBase() = default;
};

template 
class Slot : public SlotBase
{
private:
    typedef void (TRecver::*Call_Back)(TParam);
    TRecver* m_pRecver;
    Call_Back m_func;

public:
    Slot(TRecver* pObj, Call_Back func)
    {
        this->m_pRecver = pObj;
        this->m_func    = func;
    }
    ~Slot(){}

public:
    virtual void slotFunction(TParam param)override
    {
        (this->m_pRecver->*m_func)(param);
    }

};

// signal
template
class Signal
{
public:
    Signal(){}
    ~Signal(){}

public:
    template
    void addSlot(TRecver* pObj, void (TRecver::*func)(TParam ))
    {
        m_vecSignalSlot.push_back(new Slot(pObj,func));
    }

    void operator()(TParam param)
    {
        for(SlotBase*p : m_vecSignalSlot)
        {
            p->slotFunction(param); // 最好可变参
        }
    }

private:
    std::vector*> m_vecSignalSlot;
};

class RecverA
{
public:
    void func(int param)
    {
        std::cout << "Test RecverA param: " << param << std::endl;
    }
};

class RecverB
{
public:
    void func(int param)
    {
        std::cout << "Test RecverB param: " << param << std::endl;
    }
};

class SendObj
{
public:
    SendObj(){}
    ~SendObj(){}

public:
    void test_signal(int value)
    {
        valueChanged(value);
    }

public:
    Signal  valueChanged;
};

#define connect(sender,signal,recver,method) (sender)->signal.addSlot(recver,method)

int main()
{
   RecverA* r1 = new RecverA;
   RecverB* r2 = new RecverB;

   SendObj *sd = new SendObj;
   connect(sd, valueChanged, r1, &RecverA::func);
   connect(sd, valueChanged, r2, &RecverB::func);

   sd->test_signal(123);

    return 0;
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/879788.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号