1.模板
1.1模板的概念
模板是泛型编程的基础,泛型编程即以一种独立于任何特定类型的方式编写代码。
也可以理解为函数的蓝图或公式。库容器,比如迭代器和算法,都是泛型编程的例子,它们都使用了模板的概念。
特点:通用性强
1.2模板
-
C++另一种编程思想称为泛型编程,主要利用的技术就是模板
-
C++提供两种模板机制:函数模板和类模板
1.2.1函数模板语法
函数模板作用:
建立一个通用函数,其函数返回值类型和形参类型可以不具体制定,用一个虚拟的类型来代表。
语法:
template<typename T>
//函数声明或定义
解释:
template — 声明创建模板
typename — 表面其后面的符号是一种数据类型,可以用class代替
T — 通用的数据类型,名称可以替换,通常为大写字母
示例
/***************************************
*@File :template.cpp
*@IDE :CLion
*@Author :lingxiaotian
*@Date :2022/9/14 19:37
***************************************/
#include "iostream"
#include <string>
using namespace std;
//函数模板
template<class T>
//交换两个数的模板
void swapNumber(T &a,T &b){
T temp = a;
a = b;
b = temp;
}
//整型交换
void test(){
int a = 8;
int b = 12;
swapNumber(a,b);
cout<<"交换后a的值是:"<<a<<endl;
cout<<"交换后b的值是:"<<b<<endl;
}
//浮点交换
void test1(){
float a = 100.86;
float b = 124.01;
swapNumber(a,b);
cout<<"交换后a的值是:"<<a<<endl;
cout<<"交换后b的值是:"<<b<<endl;
}
//字符串交换
void test2(){
string a = "我原本是个a~";
string b = "我他喵的是b啊!";
swapNumber(a,b);
cout<<"交换后a的值是:"<<a<<endl;
cout<<"交换后b的值是:"<<b<<endl;
}
int main(){
test();
test1();
test2();
}
可以看到此时只需要使用一个模板,即可完成两个相同类型数据的交换,而不为每种数据类型分别写出交换函数,这也正是模板的特点——泛用性。
此时调用函数swapNumber()时是使其自动推到参数的类型,还可以手动指定数据类型。
手动指定数据类型
//字符串交换
void test2(){
string a = "我原本是个a~";
string b = "我他喵的是b啊!";
//手动指定数据类型
swapNumber<string>(a,b);
cout<<"交换后a的值是:"<<a<<endl;
cout<<"交换后b的值是:"<<b<<endl;
}
写该案例时出现过一个报错,代码如下:
报错案例
//函数模板
template<class T>
//交换两个数的模板
void swap(T &a,T &b){
T temp = a;
a = b;
b = temp;
}
//整型交换
void test(){
int a = 10;
int b = 123;
swap(a,b); //!!!此处报错,call to 'swap' is ambiguous!!
cout<<"交换后a的值是:"<<a<<endl;
cout<<"交换后b的值是:"<<b<<endl;
}
int main(){
test();
}
在调用模板函数swap()时出现错误,错误提示为“call to ‘swap’ is ambiguous”,研究后发现是与c++自身的库函数名冲突,于是改为swapNumber后解决。
!所以诸位一定要注意命名的规范性呐~~