苦恼的小蝌蚪 · “流感新星” 玛巴洛沙韦,您用对了吗?· 3 月前 · |
憨厚的充值卡 · Google ...· 4 月前 · |
焦虑的领结 · 古人将女子怀孕称“身怀六甲”,六甲什么意思, ...· 1 年前 · |
刚毅的皮带 · 一念纵横类似的漫画推荐,一念纵横搞笑奇幻悬疑 ...· 1 年前 · |
呐喊的键盘 · 国产"跑车"处境尴尬 ...· 1 年前 · |
模板是泛型编程的基础,泛型编程即以一种独立于任何特定类型的方式编写代码。
模板是创建泛型类或函数的蓝图或公式。库容器,比如迭代器和算法,都是泛型编程的例子,它们都使用了模板的概念。
每个容器都有一个单一的定义,比如 向量 ,我们可以定义许多不同类型的向量,比如 vector <int> 或 vector <string> 。
您可以使用模板来定义函数和类,接下来让我们一起来看看如何使用。
模板函数定义的一般形式如下所示:
在这里,type 是函数所使用的数据类型的占位符名称。这个名称可以在函数定义中使用。
下面是函数模板的实例,返回两个数中的最大值:
当上面的代码被编译和执行时,它会产生下列结果:
Max(i, j): 39 Max(f1, f2): 20.7 Max(s1, s2): World正如我们定义函数模板一样,我们也可以定义类模板。泛型类声明的一般形式如下所示:
template <class type> class class-name {在这里, type 是占位符类型名称,可以在类被实例化的时候进行指定。您可以使用一个逗号分隔的列表来定义多个泛型数据类型。
下面的实例定义了类 Stack<>,并实现了泛型方法来对元素进行入栈出栈操作:
当上面的代码被编译和执行时,它会产生下列结果:
hello Exception: Stack<>::pop(): empty stackgt
gt@***ms.org
gt
gt@***ms.org
相信学习 C++ 的人对 class 这个关键字都非常明白,class 用于定义类,在模板引入 c++ 后,最初定义模板的方法为:
template<class T>......这里 class 关键字表明T是一个类型,后来为了避免 class 在这两个地方的使用可能给人带来混淆,所以引入了 typename 这个关键字,它的作用同 class 一样表明后面的符号为一个类型,这样在定义模板的时候就可以使用下面的方式了:
template<typename T>......
在模板定义语法中关键字 class 与 typename 的作用完全一样。
typename 难道仅仅在模板定义中起作用吗?其实不是这样,typename 另外一个作用为:使用嵌套依赖类型(nested depended name),如下所示: class MyArray public: typedef int LengthType; ..... template<class T> void MyMethod( T myarr ) typedef typename T::LengthType LengthType; LengthType length = myarr.GetLength;
这个时候 typename 的作用就是告诉 c++ 编译器,typename 后面的字符串为一个类型名称,而不是成员函数或者成员变量,这个时候如果前面没有 typename,编译器没有任何办法知道 T::LengthType 是一个类型还是一个成员名称(静态数据成员或者静态函数),所以编译不能够通过。
oin625
178***2902@qq.com
Asuka
pau***e@163.com
起风吧
104***1205@qq.com
函数模板:
#include <iostream> using namespace std; template <typename T1> void Swap(T1& a, T1& b) T1 t = a; a = b; b = t; int main() int a = 2; int b = 3; cout <<"a = " << a << "; b = " << b <<endl; Swap(a,b); cout <<"a = " << a << "; b = " << b <<endl; float c = 0.02; float d = 0.03; cout <<"c = " << c << "; d = " << d <<endl; Swap(c,d); cout <<"c = " << c << "; d = " << d <<endl; return 0;#include <iostream> using namespace std; template <typename T> class Op{ public: T peocess(T v) return v * v; int main() Op<int> opInt; Op<double> opDouble; cout << "5 * 5 = " << opInt.peocess(5) <<endl; cout << "0.5 * 0.5 = " << opDouble.peocess(0.5) <<endl; }
苦恼的小蝌蚪 · “流感新星” 玛巴洛沙韦,您用对了吗? 3 月前 |