泛型编程概念及函数模板
白云泉
唐代:白居易
天平山上白云泉,云自无心水自闲。
何必奔冲山下去,更添波浪向人间。
泛型编程的引入
想要比较两个整形数据的大小,写一个形参数是整形的函数。想要比较两个浮点型数据的大小,写一个形参是浮点型的函数。想要比较两个字符的ascii码的大小,写一个形参是char的函数。实际上几个函数的代码都差不多,那你觉得啰里八嗦写了一堆代码,烦不烦?
所以,如果可以把数据类型也作为一种可以灵活传递的参数,就太人性了。这种编程就是泛型编程了。
泛型,广泛的类型,指的仍是一种数据类型,它是一种通用类型,它可以代替其它多种类型,这个方法可以大规模的减少程序代码的编写量和重复性。泛型编程利用的主要技术是模板。
模板
C++中有两种模板机制:函数模板,类模板
函数模板
- 函数的返回类型和形参的类型可以不具体指定,用代号T来表示,T称为泛型(generic type)。使用这种类型占位符的编程方式就叫泛型编程。
- 在函数调用的时候再去确认T的实际类型。
- 语法: template, 在有了这个声明后,其下紧跟的函数就是一个函数模板。template:声明创建模板,typename:表明其后的符号代表一种数据类型,也可以用class代替。后面可以有多个typename。T:通用数据类型,也可以用其它符号代替。
- 函数模板的两种实现方式
– 自动类型转换
– 显式指定类型,推荐。
code:
# include <iostream>
using namespace std;
template <typename T> // 声明一个模板,告诉编译器后面代码中紧跟着的T是一个通用数据模型
T max_2(T a, T b) // T是抽象的一个类型,在使用的时候再确定具体类型
{
T result = a > b ? a : b;
cout << "the max value: " << result << endl;
return result;
}
template <typename T> // 声明一个模板,告诉编译器后面代码中紧跟着的T是一个通用数据模型
void swap_2(T &a, T &b) // T是抽象的一个类型,在使用的时候再确定具体类型
{
T temp = a;
a = b;
b = temp;
}
int main()
{
max_2(8, 5);
max_2(8.6, 9.5);
int a = 666;
int b = 888;
cout << "原始的a: " << a << ", 原始的b: " << b << endl;
swap_2(a, b); // 模板实现的方式是自动类型转换
cout << "交换后的a: " << a << ", 交换后的b: " << b << endl;
float c = 666.666;
float d = 888.888;
cout << "原始的c: " << c << ", 原始的d: " << d << endl;
swap_2<float>(c, d); // 模板实现的方式是显式指定类型
cout << "交换后的c: " << c << ", 交换后的d: " << d << endl;
system("pause");
return 0;
}
result:
the max value: 8
the max value: 9.5
原始的a: 666, 原始的b: 888
交换后的a: 666, 交换后的b: 888
原始的c: 666.666, 原始的d: 888.888
交换后的c: 888.888, 交换后的d: 666.666
函数模板注意事项
- 如果使用自动类型推导,如果只使用类型T,则必须要能推导出一致的数据类型T。
- T必须要有确定的类型,可以使用显示指示类型方式直接指定。
code:
#include <iostream>
using namespace std;
template <typename T>
void swap_1(T& a, T& b) // T是抽象的一个类型,在使用的时候再确定具体类型
{
T temp = a;
a = b;
b = temp;
}
template <typename T>
void print_info()
{
cout