mangos 代码大量用到模板,而且用的很灵活,现阶段先把模板看一下,理解一下mangos的模板设计思路。
首先什么是模板,其实就是为了实现代码的复用,基本上是实现逻辑代码的复用。通过将类型作为参数传入函数模板和类模板,不同的类型,实现逻辑算法的复用,类型的范围很广,可以是标准类,自定义类,基本类型。(模板中的迭代器下章再论)
在mangos的就通过将类作为模板类型传入模板类中,实现回调函数在类中的实现:
//类型默认值设置,使类型的传递个数比较灵活。
template < class Class,
typename ParamType1 = void,
typename ParamType2 = void,
typename ParamType3 = void,
typename ParamType4 = void >
class _Callback
{
protected:
//回调函数指针定义
typedef void (Class::*Method)(ParamType1, ParamType2, ParamType3, ParamType4);
Class *m_object;
//类中回调函数指针声明
Method m_method;
ParamType1 m_param1;
ParamType2 m_param2;
ParamType3 m_param3;
ParamType4 m_param4;
//通过函数指针和类实例指针,调用传入的类实例的函数实现回调函数
//怎样就可以将类的类型和类中函数的函数名都推迟到调用的时候才确定,充分赋予该类的灵活性。
void _Execute()
{
(m_object->*m_method)(m_param1, m_param2, m_param3, m_param4);
}
public:
//参数按照类里面变量定义顺序传入和赋值
//bug: 最好在初始化函数里面进行,因为构造函数没有返回值,无法判断是否传入有效。
// object 指针传入类实例指针,函数指针,和函数需要的参数。
_Callback(Class *object, Method method, ParamType1 param1,
ParamType2 param2, ParamType3 param3, ParamType4 param4)
: m_object(object), m_method(method), m_param1(param1),
m_param2(param2), m_param3(param3), m_param4(param4) {}
//重载构造函数,通过本类_Callback 实例传入进行拷贝
_Callback(_Callback < Class, ParamType1, ParamType2, ParamType3, ParamType4> const& cb)
: m_object(cb.object), m_method(cb.m_method), m_param1(cb.m_param1),
m_param2(cb.m_param2), m_param3(cb.m_param3), m_param4(cb.m_param4) {}
};