posts - 225, comments - 62, trackbacks - 0, articles - 0
   :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

用标准C++实现信号与槽机制

Posted on 2010-11-15 22:35 魔のkyo 阅读(3369) 评论(1)  编辑 收藏 引用
以前一直以为用标准C++无法实现类似委托或者信号与槽的机制。
还写过一篇BLOG http://www.cnitblog.com/luckydmz/archive/2009/11/23/62785.html
看来我还是“太年轻”,无知啊。
#include <algorithm>
#include 
<iostream>
#include 
<vector>
using namespace std;

template
<class T1>
class SlotBase
{
public:
    
virtual void Exec(T1 param1) = 0;
};

template
<class T, class T1>
class SlotImpl : public SlotBase<T1>
{
public:
    SlotImpl(T
* pObj, void (T::*func)(T1) )
    {
        m_pObj 
= pObj;
        m_Func 
= func;
    }

    
void Exec( T1 param1)
    {
        (m_pObj
->*m_Func)(param1);
    }

private:
    T
* m_pObj;
    
void (T::*m_Func)(T1);
};

template
<class T1>
class Slot
{
public:
    template
<class T>
    Slot(T
* pObj, void (T::*func)(T1))
    {
        m_pSlotBase 
= new SlotImpl<T,T1>(pObj, func);
    }

    
~Slot()
    {
        delete m_pSlotBase;
    }

    
void Exec(T1 param1)
    {
        m_pSlotBase
->Exec(param1);
    }

private:
    SlotBase
<T1>* m_pSlotBase;
};

template
<class T1>
class Signal
{
public:
    template
<class T>
    
void Bind(T* pObj, void (T::*func)(T1))
    {
        m_pSlotSet.push_back( 
new Slot<T1>(pObj,func) );
    }

    
~Signal()
    {
        
for(int i=0;i<(int)m_pSlotSet.size();i++)
        {
            delete m_pSlotSet[i];
        }
    }

    
void operator()(T1 param1)
    {
        
for(int i=0;i<(int)m_pSlotSet.size();i++)
        {
            m_pSlotSet[i]
->Exec(param1);
        }
    }

private:
    vector
< Slot<T1>* > m_pSlotSet;
};

#define Connect( sender, signal, receiver, method) ( (sender)->signal.Bind(receiver, method) )

class A
{
public:
    
void FuncOfA(int param)
    {
        printf(
"A::FuncOfA(%d)\n", param);
    }
};

class B
{
public:
    
void FuncOfB(int param)
    {
        printf(
"B::FuncOfB(%d)\n", param);
    }
};

class C
{
public:
    C()
    {
        m_Value 
= 0;
    }
    
void SetValue(int value)
    {
        
if(m_Value != value)
        {
            m_Value 
= value;
            ValueChanged(m_Value);
        }
    }
    
public:
    Signal
<int> ValueChanged;

private:
    
int m_Value;
};

int main()
{
    A
* pA = new A;
    B
* pB = new B;
    C
* pC = new C;

    Connect(pC, ValueChanged, pA, 
&A::FuncOfA);
    Connect(pC, ValueChanged, pB, 
&B::FuncOfB);

    pC
->SetValue(10);
    pC
->SetValue(5);
    pC
->SetValue(5);

    delete pC;
    delete pB;
    delete pA;

    scanf(
"%*s");
}

Feedback

# re: 用标准C++实现信号与槽机制  回复  更多评论   

2013-03-09 02:47 by 天晴软件
对于C++实现信号与槽机制,我可不可以理解为设计模式中的观察者模式
只有注册用户登录后才能发表评论。