两种c++程序设计范型:
(1)按照面向过程式范型把程序划分为不同的函数
(2)按照面向对象式范型把代码和数据组织成各种各样的类并建立类之间的继承关系.
(3)泛型编程:支持程序员创建函数和类的蓝图(即模板,template),而不是具体的函数和类
当程序需要用到这些函数中的某一个时,编译器将根据模板即时生成一个能够对特定数据类型进行处理的代码版本.在泛型编程技术里,我们仍然要编写自己的函数和类,但不必限定它们所使用的数据类型.只需要使用一个占位符(通常用字母T来表示),然后用这个占位符来编写函数.当程序需要这段代码时,你提供数据类型,编译器将根据你的模板即时生成实用的代码.
基本的模板语法:
template <class T>
void foo(T param)
{
// do something
}
注意: 在尖括号里有一个class T,用来告诉编译器:字母T将在接下来的函数里代表一种不确定的数据类型.
举个栗子:
变换两个变量的值:
比如我们编写一个swap的函数,输入的数据是int型,但是如果现在要输入double的参数该怎么办,第一个想到的是用函数重载,增加一个swap(double &a, double &b)函数,但是如果有多重输入的类型呢?这就会带来一个问题:需要反复编写同样的代码.
这里就需要采用函数模板来解决这个问题.因此当你再使用swap()函数时,编译器将根据模板自动创建一个函数,该函数会使用正确的数据类型完成交换变量值的任务.
举个栗子:
#include <iostream>
#include <string>
using namespace std;
template <class T>
void swap(T &a, T &b)
{
T tmp = a;
a = b;
b = tmp;
}
int main()
{
int i1 = 100;
int i2 = 200;
cout << "交换前: i1 = " << i1 << ", i2 = " << i2 << endl;
swap(i1, i2);
cout << "交换后: i1 = " << i1 << ", i2 = " << i2 << endl;
string s1 = "小甲鱼";
string s2 = "小鱿鱼";
cout << "交换前: s1 = " << s1 << ", s2 = " << s2 << endl;
swap(s1, s2);
cout << "交换后: s1 = " << s1 << ", s2 = " << s2 << endl;
return 0;
}
上述代码编译不通过,后来在qt上也编译不通过.
提示的错误: call of overloaded 'swap(T &a, T &b)' is ambiguous
发现是自己偷懒造成的, 一直以来都是使用using namespace std; 结果今天就出问题了,原因是标准库的命名空间std中也有一个swap()函数,所以才会导致二义性.于是把所有的std都换一下,编译通过.