看看 sigslot.h 的内部实现, 以比较简单的 signal1为例,它可有一个参数, 两个模板参数一个是参数类型,一个是多线程策略
重点是它的
1) connect 方法 , 将它和目的类和目的方法进行连接
2) emit 方法, 触发消息发送到槽的对应方法
template<class arg1_type, class mt_policy = SIGSLOT_DEFAULT_MT_POLICY>
class signal1 : public _signal_base1<arg1_type, mt_policy>
{
public:
typedef _signal_base1<arg1_type, mt_policy> base;
typedef typename base::connections_list connections_list;
using base::m_connected_slots;
signal1()
{
;
}
signal1(const signal1<arg1_type, mt_policy>& s)
: _signal_base1<arg1_type, mt_policy>(s)
{
;
}
template<class desttype>
void connect(desttype* pclass, void (desttype::*pmemfun)(arg1_type))
{
lock_block<mt_policy> lock(this);
_connection1<desttype, arg1_type, mt_policy>* conn =
new _connection1<desttype, arg1_type, mt_policy>(pclass, pmemfun);
m_connected_slots.push_back(conn);
pclass->signal_connect(this);
}
void emit(arg1_type a1)
{
lock_block<mt_policy> lock(this);
typename connections_list::const_iterator itNext, it = m_connected_slots.begin();
typename connections_list::const_iterator itEnd = m_connected_slots.end();
while(it != itEnd)
{
itNext = it;
++itNext;
(*it)->emit(a1);
it = itNext;
}
}
void operator()(arg1_type a1)
{
lock_block<mt_policy> lock(this);
typename connections_list::const_iterator itNext, it = m_connected_slots.begin();
typename connections_list::const_iterator itEnd = m_connected_slots.end();
while(it != itEnd)
{
itNext = it;
++itNext;
(*it)->emit(a1);
it = itNext;
}
}
};