最近看了C++ 的sigslot库,对其里面模板类 模板成员函数的一些用法记录下
#include <iostream>
#include "sigslot.h"
using namespace sigslot;
class Switch
{
public:
signal0<> clicked;
};
class Light : public has_slots<>
{
public:
void on()
{
std::cout << "the light is on\n";
}
};
int main(int argc, char *argv[])
{
Light light;
Switch sw;
sw.clicked.connect(&light, &Light::on);
sw.clicked.emit();
system("pause");
return 0;
}
其中signal0<> clicked为模板类,sw.clicked.connect为模板类模板成员函数,看下它的实现:
template<class mt_policy = SIGSLOT_DEFAULT_MT_POLICY>
class signal0 : public _signal_base0<mt_policy>
{
public:
typedef _signal_base0<mt_policy> base;
typedef typename base::connections_list connections_list;
using base::m_connected_slots;
signal0()
{
;
}
signal0(const signal0<mt_policy>& s)
: _signal_base0<mt_policy>(s)
{
;
}
template<class desttype>
void connect(desttype* pclass, void (desttype::* pmemfun)())
{
lock_block<mt_policy> lock(this);
_connection0<desttype, mt_policy>* conn =
new _connection0<desttype, mt_policy>(pclass, pmemfun);
m_connected_slots.push_back(conn);
pclass->signal_connect(this);
}
void emit()
{
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();
it = itNext;
}
}
void operator()()
{
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();
it = itNext;
}
}
};
其中template<class desttype>
void connect(desttype* pclass, void (desttype::* pmemfun)()) 为类模板模板成员函数的写法,sw.clicked.connect(&light, &Light::on);为模板成员函数的调用。