C++教程正在更新中,具体请查看教程目录
C++的模板在维基百科中的解释如下:
模板(Template)指C++程序设计语言中的函数模板与类模板[1],是一种参数化类型机制,大体对应于java和C#中的泛型,但也有一些功能上的显著差异(C++模板支持后两者没有明确对应的模板模板参数和模板非类型参数,但不支持Java的通配符以及C#的泛型类型约束)。模板是C++的泛型编程中不可缺少的一部分。
模板是C++程序员绝佳的武器,特别是结合了多重继承与运算符重载之后。C++的标准函数库提供的许多有用的函数大多结合了模板的概念,如STL以及iostream。
模板是泛型编程的基础,泛型编程就是以一种独立于任何特定类型的方式进行编写代码。
模板是创建泛型类或者函数的蓝图或者公式,库容器中的迭代器或者算法都是泛型编程的例子,他们都使用了模板的概念。每个容器都有一个单一的定义,比如vector,我们可以定义许多不同类型的vector。比如vector或者vector。我们可以使用模板来洞以函数和类。
函数模板的定义的一般形式如下所示:
template <typename type> ret-type func-name(parameter list){
...
}
上述模板中type是函数所使用的数据类型的占位符的名称,这个名称可以在函数的定义中使用,下面以求两数最大值为例运用函数模板:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define R register
#define LL long long
#define pi 3.141
#define INF 1400000000
using namespace std;
template <typename T>
inline T MAX(T number1, T number2) {
return number1 > number2 ? number1 : number2;
}
int main() {
int a, b;
cin >> a >> b;
cout << MAX(a, b) << "\n";
double c, d;
cin >> c >> d;
cout << MAX(c, d) << "\n";
char e, f;
cin >> e >> f;
cout << MAX(e, f) << "\n";
return 0;
}
上面的例子中的typename改为class也可以。
和我们定义函数模板的形式一样,我们同样可以定义类模板,泛型类的声明的一般形式如下所示:
template <class type> class class-name{
...
}
此时的type是占位符的类型名称,可以在类被实例化的时候进行指定,亦可以使用一个逗号分隔的列表来定义多个泛型的数据类型。
下面的代码中定义了类Stack,并是想了用泛型的方法来对元素进行入栈出栈的操作:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define R register
#define LL long long
#define pi 3.141
#define INF 1400000000
using namespace std;
template <class T>
class Stack {
private:
stack<T> elems;
public:
void push(T const & number) {
elems.push(number);
}
void pop() {
if (elems.empty()) {
cout << "This stack is empty.\n";
}
else {
elems.pop();
}
}
void top();
};
template <class T>
void Stack<T> ::top() {
if (elems.empty()) {
cout << "This stack is empty.\n";
}
else {
cout << elems.top();
}
}
int main() {
Stack<int> my_stack;
my_stack.push(1);
my_stack.top();
my_stack.push(2);
my_stack.push(3);
my_stack.pop();
my_stack.top();
return 0;
}
在C++的template中有很多地方用到了typename和class这两个关键字,而且似乎这两个关键字在一定情况下可以进行替换,那么我们的问题就是这两个关键字是否完全一样?
class用于定义类,在模板引入C++后,最初定义模板的方法为:
template<class T>......
这里的class关键字表示T是一个类型,后来为了避免class在这两个地方的使用给使用者带来混淆,因此引入typename这个关键字,这个关键字的作用和class一样表明后面的符号是一个类型,这样在定义模板的时候就可以使用下面的方式为:
template<typename T>......
在模板的定义语法中关键字class和typename的作用完全一样。
typename的另一个作用是:使用嵌套以来类型
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 是一个类型还是一个成员名称(静态数据成员或者静态函数),所以编译不能够通过。
函数模板可以进行重载,只要他们的形参表不同即可。
查看上一篇:C++重载运算符和重载函数
查看下一篇:
查看目录:C++教程目录