#include <iostream>
#include <boost/shared_ptr.hpp>
#include <vector>
#include <algorithm>
using namespace boost;
using namespace std;
typedef int RType;
typedef RType (*FunctionType)();
class MySlot
{
public:
bool IsValid() {return fun_!=0;}
//bool operator == (MySlot const &rls) {return this==&rls;}
//protected:
//private:
//friend class MyConnection;
FunctionType fun_;
};
class MySignal0;
class MyConnection
{
public:
bool IsValid() {return slot_ && slot_->IsValid();}
void Disconnect();
bool operator == (MyConnection const &rls) {return signal_ == rls.signal_ && rls.slot_ == slot_;}
//protected:
//private:
//friend class MySignal0;
shared_ptr<MySlot> slot_; //for see connection's state
MySignal0* signal_;//for disconnect
};
class MySignal0
{
public:
//MyConnection Connect(const FunctionType & fun)
MyConnection Connect(FunctionType fun)
{
MyConnection con;
con.slot_.reset(new MySlot);
con.slot_->fun_ = fun;
con.signal_ = this;
cons_.push_back(con);
return con;
}
RType operator()()
{
vector <MyConnection>::iterator it = cons_.begin();
vector <MyConnection>::iterator itEnd = cons_.end();
RType r = RType();
for(;it!=itEnd;++it)
{
if((*it).slot_)
r = (*it).slot_->fun_();
}
return r;
}
//protected:
//private:
void Remove(MyConnection const &con)
{
vector <MyConnection>::iterator it = std::find(cons_.begin(),cons_.end(),con);
if(it!=cons_.end())
{
(*it).slot_.reset();
std::remove(cons_.begin(),cons_.end(),con);
cout<<"Remove Succeed.\n";
}
else
cout<<"Remove Fail.\n";
}
vector <MyConnection> cons_;
};
void MyConnection::Disconnect(){
signal_->Remove(*this);
}
int f() {
cout<<"f()\n";
return 0;
}
void main1()
{
MySignal0 sig;
MyConnection con = sig.Connect(f);
sig();
con.Disconnect();
sig();
}
void main()
{
MyConnection con;
cout<<"after init con:\n";
cout<<"con is_valid:"<<con.IsValid()<<endl;
{
MySignal0 sig;
cout<<"after connect to sig:\n";
con = sig.Connect(f);
sig();
cout<<"con is_valid:"<<con.IsValid()<<endl;
cout<<"after disconnect:\n";
con.Disconnect();
sig();
cout<<"con is_valid:"<<con.IsValid()<<endl;
}
cout<<"after signal destruct:\n";
cout<<"con is_valid:"<<con.IsValid()<<endl;
}
原文链接: https://www.cnblogs.com/cutepig/archive/2011/02/17/1956933.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/21118
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!