泛型(Generic Programming),即是指具有在多种数据类型上皆可操作的含意。
泛型编程 的代表作品 STL 是一种高效、泛型、可交互操作的软件组件。 泛型编程最初诞生于 C++中,目的是为了实现 C++的 STL(标准模板库)。其语言支持机制就是模板(Templates)。模板的精神其实很简单:参数化类型。换句话说,把一个原本特定于某个类型的算法或类当中的类型信息抽掉,抽出来做成模板参数 T。
所谓函数模板,实际上是建立一个通用函数,其函数类型和形参类型不具体指定,用一个虚拟的类型来代表。这个通用函数就称为 函数模板。
语法格式如下:
template <typename T>
返回类型 函数模板名(函数参数列表)
{
函数模板定义体
}
template 是语义是模板的意思,尖括号中先写关键字 typename 或是 class,后面跟一个类型 T,此类即是虚拟的类型。至于为什么用 T,用的人多了,也就是 T 了。
// funcTemplate.cpp,函数模板
#include <iostream>
using namespace std;
template <typename T>
void mySwap(T &a, T &b)
{
T t = a;
a = b;
b = t;
}
int main()
{
int x = 1;
int y = 2;
mySwap(x,y);
cout << "x:" << x << ",y:" << y << endl;
mySwap<int>(x,y);
cout << "x:" << x << ",y:" << y << endl;
char a = ‘a‘;
char b = ‘b‘;
mySwap(a,b);
cout << "a:" << a << ",b:" << b << endl;
mySwap<char>(a,b);
cout << "a:" << a << ",b:" << b << endl;
return 0;
}
运行结果:
函数模板,只适合函数的参数个数相同而类型不同,且函数体相同的情况。如果个数不同,则不能用函数模板。
类模板与函数模板的定义和使用类似,我们已经进行了介绍。 有时,有两个或多个类,其功能是相同的,仅仅是数据类型不同,所以将类中的类型进行泛化。
语法格式如下:
template <typename T>
class 类名
{
}
下面的实例定义了类 Stack<>,并实现了泛型方法来对元素进行入栈出栈操作:
#include <iostream>
#include <vector>
#include <cstdlib>
#include <string>
#include <stdexcept>
using namespace std;
template <class T>
class Stack {
private:
vector<T> elems; // 元素
public:
void push(T const&); // 入栈
void pop(); // 出栈
T top() const; // 返回栈顶元素
bool empty() const{ // 如果为空则返回真。
return elems.empty();
}
};
template <class T>
void Stack<T>::push (T const& elem)
{
// 追加传入元素的副本
elems.push_back(elem);
}
template <class T>
void Stack<T>::pop ()
{
if (elems.empty()) {
throw out_of_range("Stack<>::pop(): empty stack");
}
// 删除最后一个元素
elems.pop_back();
}
template <class T>
T Stack<T>::top () const
{
if (elems.empty()) {
throw out_of_range("Stack<>::top(): empty stack");
}
// 返回最后一个元素的副本
return elems.back();
}
int main()
{
try {
Stack<int> intStack; // int 类型的栈
Stack<string> stringStack; // string 类型的栈
// 操作 int 类型的栈
intStack.push(7);
cout << intStack.top() <<endl;
// 操作 string 类型的栈
stringStack.push("hello");
cout << stringStack.top() << std::endl;
stringStack.pop();
stringStack.pop();
}
catch (exception const& ex) {
cerr << "Exception: " << ex.what() <<endl;
return -1;
}
}
当上面的代码被编译和执行时,它会产生下列结果:
7
hello
Exception: Stack<>::pop(): empty stack
原文:https://www.cnblogs.com/PikapBai/p/13263467.html