模板 虚函数

来源:互联网 发布:深圳迈瑞工资待遇知乎 编辑:程序博客网 时间:2024/04/30 08:30

http://bbs.csdn.net/topics/340247978

按我的阅读和设计经验,一个体系结构如果要用模板,那么这个体系里应该全都是模板,如果实在要公开某些虚基类,一般在模板继承链中最底层(最后派生层)实现基类函数(除非有特殊需求),但前提是这个虚基类的成员参数不能是模板。

在模板世界里,虚函数除了增加虚表大小和降低运行性能,没有实际意义。STL/ATL/WTL是典型的全模板架构,没有任何虚函数,MFC采用的是全虚表架构,虽然有部分模板类,但只是作为工具类存在,有没有都不影响整体。

全模板架构的好处就是:你能由粗到细来设计模板。一旦某种粒度的模板不能满足要求,则可以把需要抽象的部分再次提炼成模板而不是提炼成基类,而且所有函数都是编译期就定好了。这样不断提炼不断细分的后果就是代码越来越晦涩难懂,可读性很差。全虚表架构刚好相反,你必须先设计基类,再实现派生类,它的代码可读性非常好,但虚表的值是在运行期才填入的。

废话说了不少,现在尝试解决你的问题。你不是想实现函数调用操作符吗,先按照参数个数实现9个模板类:
template<class T>
class CallT0
{
public:
  void operator()(){}
};

template<class T, typename param1>
class CallT1
{
public:
  void operator()(param1 p1) {...}
};

......

第二步,根据实际的类选择不同的模板基类:
template<class T>
class delegate_0 : public CallT0<T>
{
  ...
};

template<class T, typename param1>
class delegate_1 : public CallT1<T,param1>
{
  ...
};
......

你有没有发现这种设计很好写代码?强行把编译期的多态和运行期的多态混合在一起,就像新手练瑜伽,无论如何找不到着力点。