概述
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
#define Connect(sender, signal, receiver, method) ((sender)->signal.Bind(receiver, method))
template<class T>
class SlotBase
{
public:
virtual void Exec(T param1) = 0; //纯虚函数
virtual ~SlotBase() {}
};
template<class T, class T1>
class Slot : public SlotBase<T1>
{
public:
/* 定义Slot的时候,获取槽函数信息 */
Slot(T* pObj, void (T::*func)(T1))
{
m_pSlotBase = pObj;
m_Func = func;
}
/* signal触发时,调用 */
void Exec(T1 param1)
{
(m_pSlotBase->*m_Func)(param1);
}
private:
/* 槽函数信息 暂存 */
T* m_pSlotBase = NULL;
void (T::*m_Func)(T1);
};
template<class T1>
class Signal
{
public:
/* 模板函数 -> Bind时获取槽函数指针 */
template<class T>
void Bind(T* pObj, void (T::*func)(T1))
{
m_pSlotSet.push_back(new Slot<T, T1>(pObj, func));
}
/* 重载操作符 -> signal触发机制 */
void operator()(T1 param1)
{
for (int i = 0; i<(int)m_pSlotSet.size(); i++)
{
m_pSlotSet[i]->Exec(param1);
}
}
~Signal()
{
for (int i = 0; i<(int)m_pSlotSet.size(); i++)
{
delete m_pSlotSet[i];
}
}
private:
vector<SlotBase<T1>*> m_pSlotSet; //这一句很重要,靠基类的指针来存储 信号槽指针
};
class Test1
{
public:
void FuncOfA(bool parm)
{
printf("enter Test1 parm = %dn", parm);
}
};
class TestSignal
{
public:
TestSignal()
{
}
void emit(boolvalue)
{
ValueChanged(value);
}
public:
Signal<bool> ValueChanged;
};
最后
以上就是害羞悟空为你收集整理的C++实现的信号与槽的全部内容,希望文章能够帮你解决C++实现的信号与槽所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复