模板编程






2.27/5 (9投票s)
2002年3月25日
2分钟阅读

146751
正如我们已经知道的,继承是一种重用代码的好方法。然而,Visual C++ 提供了另一种重用代码的方式。我们可以通过模板来实现。使用模板,你可以使“类型”成为参数。让我来解释一下。
引言
正如我们已经知道的,继承是一种重用代码的好方法。然而,Visual C++ 提供了另一种重用代码的方式。我们可以通过模板来实现。使用模板,你可以使“类型”成为参数。让我来解释一下。当你有一个显示所有处理器信息的类时,这个类非常庞大,并且它使用所有的整数。如果将来整数无法存储处理器的信息(仅仅是因为它超出了整数的范围),会怎么样?现在你需要检查所有的代码,并将整数更改为长整型。或者当你有一个处理整数数组的类,并且有一天你需要完全相同的类,只是你想让它处理浮点数。
详细说明
对于这些问题,我们有模板。让我向你展示一些代码
class CMyIntArray { public: int GetSize();//gets the size of the array int SetSize();//sets the size of the array void Add(int Value);//adds a value to the array etc... }
正如从这段代码中可以看出,你无法用这个类处理浮点数。一个浮点数类看起来会是这样
class CMyFloatArray { public: int GetSize();//gets the size of the array int SetSize();//sets the size of the array void Add(float Value);//adds a value to the array etc... }
好的,我们可以处理这么一点小的改动……但是如果你有很多函数,并且我们需要相同的类来处理短整型、字符等等呢?
你可能知道旧的 C 宏(#define),基于模板的编程就像那样(在某种程度上)。但是,类型宏不是类型安全的,模板是类型安全的。如果你想知道如何创建一个模板,请查看下面的代码
//Use of templates in Visual C++ by Clemens Timmermans (maxcode.com) template <typename Type> class CMyArray { public: void Add(Type Value); int GetSize(); int SetSize(); };
这不是很简单吗?现在让我们看看如何使用这个模板,通过以下代码片段
... // USING CMyArray CMyArray <int> iArray; iArray.Add(100); //////////////////// CMyArray<float> fArray; fArray.Add(10.2); ///////////////////// ... //you got the point of basic template use!
不,最后,我们也可以将模板用作容器。请查看以下代码
class CMercedes { public: int GetMaxSpeed();//this gets the max speed of the car void SpeedUp(); CMercedes(); virtual ~CMercedes(); }
在基于模板的编程中,无论品牌是什么,我们都会这样编写。
//what if we want to create a template class //which needs to take any valid car template <typename MyCar> class CTemplateCar { private: MyCar theCar; public: CTemplateCar(){} virtual ~CTemplateCar(){} void SpeedUpWhateverCarWeLike() { theCar.SpeedUp(); } }
现在,当我们想使用模板时,使用这段代码来使用它!
... CTemplateCar<CMercedes> car; car.SpeedUpWhateverCarWeLike(); CTemplateCar<CFerrari> car2; car2.SpeedUpWhateverCarWeLike(); ...
我希望这篇文章能帮助你理解基于模板的编程的含义,但最重要的是,如何使用它以及为什么使用它。