C++ 模板
0.泛型模板设计
泛型程序设计(Generic Programming)是在实现时不指定具体要操作数据的类型的程序设计方法。所谓“泛型”,指的是算法只要实现一遍,就能适用于多种数据类型。泛型程序设计方法的优势在于能够减少重复代码的编写。
在 C++ 中,模板分为函数模板和类模板两种。
所谓函数模板,实际上是建立一个通用函数,它所用到的数据的类型(包括返回值类型、形参类型、局部变量类型)可以不具体指定,而是用一个虚拟的类型来代替(实际上是用一个标识符来占位),等发生函数调用时再根据传入的实参来逆推出真正的类型。这个通用函数就称为函数模板(Function Template)。
在函数模板中,数据的值和类型都被参数化了,发生函数调用时编译器会根据传入的实参来推演形参的值和类型。换个角度说,函数模板除了支持值的参数化,还支持类型的参数化。
一但定义了函数模板,就可以将类型参数用于函数定义和函数声明了。说得直白一点,原来使用int、float、char 等内置类型的地方,都可以用类型参数来代替。
1.函数模板实例
#include <iostream>
using namespace std;
// 实现两个整型数字的交换
void mySwapInt(int &a, int &b)
{
int temp = a;
a = b;
b = temp;
}
// 实现两个浮点类型数字的交换
void mySwapDouble(double &a, double &b)
{
double temp = a;
a = b;
b = temp;
}
// 使用函数模板实现通用的交换
// 使用函数模板可以将类型参数化
template <typename T> // T属于通用数据类型,告诉编译器下面出现这个T类型,别报错
void mySwap(T &a, T &b)
{
T temp = a;
a = b;
b = temp;
}
template <typename T>
void fun()
{
}
int main()
{
int a = 10;
int b = 20;
mySwap(a, b); // 自动类型推导
cout << "a : " << a << " , b : " << b << endl;
char c = 'c';
// mySwap(a, c); 必须推导出一致的T类型,才可以使用模板
// 显示指定类型
mySwap<int>(a, b);
double d1 = 1.1;
double d2 = 2.2;
mySwap(d1, d2);
cout << "d1 : " << d1 <<