C++模板技术和泛型编程

模板是一种类型参数化的编程技巧。模板的参数可以是不确定的泛类型,也可以是确定的类型。这种情况下,类模板生成模板类时,确定类型的模板参数需给出该类型的类名。而泛型编程的目的是写出类型无关、可重用、清晰高效的代码,C++中实现泛型编程主要依赖模板技术。

泛型编程与面向对象编程都是编程的方法和基本理念,二者并无关联,但可以结合使用。C++的类模板与面向对象(继承多态)无关。但是由类模板生成的模板类支持各种面向对象技术。程序设计阶段优先考虑使用模板技术。

模板和继承均体现了代码重用的思想,不同处:模板技术与基于运行时的多态机制无关,它是静态编译的,是更抽象、更灵活、适应性更好、执行效率更高的编程理念。使用模板技术会稍微增加代码的编译时间,但运行效率则大大高于基于继承、虚函数和函数重载等常规手段的多态机制。

模板侧重于对相同操作、相同算法的抽象和提取,而继承侧重于相同操作但算法与步骤不同。在可能的情况下,优先考虑模板,而后考虑聚合与组合,最后再考虑继承。尽量不要创建模板类的派生类,而是作为终端类。

ScopedPointer<MyClass> ptr = new MyClass(); 改为:

typedef ScopedPointer<MyClass> MyPtr;    // 使用typedef简化模板类的声明语句
MyPtr ptr = new MyClass();


#include "Grid.h"        // 该特例类隶属的类模板

template <>                // 表明本类是一个类模板的特例
class Grid<char*>        // 类声明为模板类的形式
{
public:
    Grid();            // 重写类模板的构造函数
    Grid (const Grid<char*>& src);    // 编写本类的拷构函数与赋值运算符重载
    Grid<char*>& operator= (const Grid<char*>& rhs);
private:
    char** cells;    // 改写类模板的数据成员。类模板的数据成员是:T** cells;
};

注意:特例化和子类继承不同,类模板的特例类必须重新编写类模板的所有实现。

另:模板元编程是一个非常复杂的主题,其主要作用是:在编译时执行一些计算,而不是在运行时执行这些计算。通常需要使用模板递归技术。所谓模板递归:由一个类模板及其实例化的模板类协同配合,完成一些复杂的任务。

SwingCoder

如果本文对您有所启发或助益,请微信打赏

创作时间: 2011.05.20 12:24
最后修改: 2017.05.10 15:27

本文版权:UnderwaySoft   共享协议:署名-非商业使用-禁止演绎


上一篇: C++虚函数表与虚表指针
下一篇: C++局部类和嵌套类

 随机推荐:
Email: underwaySoft@126.com 微信公众号: UnderwaySoft