template:定义模板的关键字
typename:定义模板类型的关键字
T 通用的类型标识符
使用如下
template //这样就写了一个模板
int fun(int a, int b) {
return a + b;
}
这个函数只能进行一种类型的加和
template
T fun(T a, T b) {
return a + b;
}
模板函数,在调用函数时,模板类型可以通过实参自动推导(前提:在形参中用到了模板类型),这样就可以进行不同种类型的加和
template//T为int类型
void fun() {
T b=0;
cout << typeid(b).name() << endl;
}
int main(){
fun();//显示指定为int类型
return 0;
}
template//T为long类型
void fun(T b) {
cout << typeid(b).name() << endl;
}
int main(){
long a=10;
fun(a);//实参自动推导为long类型
return 0;
}
template//默认的模板类型T为long类型
void fun(T b) {
cout << typeid(b).name() << endl;
}
如下代码
template//T最终类型为char类型
void fun(T b) {
cout << typeid(b).name() << endl;
}
int main(){
int a=10;
fun(a);
return 0;
}
代码如下
template//不会出现报错
前面:必须要显示指定的
中间:默认类型
最后:实参推导
代码如下
template
void fun(T t) {
T t1 = 0;
K k = 0;
M m = 0;
//typeid(T).name() 这个是输出T的类型是什么
cout << typeid(T).name() << endl;//输出为double
cout << typeid(K).name() << endl;//输出为char
cout << typeid(M).name() << endl;//输出为long
}
int main(){
fun(1.1);
return 0;
}
例如
template
void fun(T b);//模板函数声明和定义可以分开写,但模板声明和定义都要写,这里是函数的声明
int main(){
fun(1.1);//这里会实例化出一个函数记为 函数1 下面展示
fun(1);//这里会实例化出一个函数记为 函数2 下面展示
return 0;
}
template//模板函数定义
void fun(T b) {
cout << typeid(T).name() << endl;
}
//函数1
void fun<>(double b) {
cout << typeid(double).name() << endl;
}
//函数2
void fun<>(int b) {
cout << typeid(int).name() << endl;
}
未优化前
#include
using namespace std;
void BubbleSort(int parr[], int len) {
for (int i = 0; i < len - 1; i++) {
for (int j = 0; j < len - i - 1; j++) {
if (parr[j]
优化后
#include
using namespace std;
template
bool rule_up(T t1,T t2) {//升序
return t1 > t2;
}
template
bool rule_down(T t1, T t2) {//降序
return t1 < t2;
}
template
void BubbleSort(T parr[], int len,bool(*P_FUN)(T,T)) {//第三个参数是判断升序还是降序的
for (int i = 0; i < len - 1; i++) {//进行排序
for (int j = 0; j < len - i - 1; j++) {
if ((*P_FUN)(parr[j],parr[j+1])) {//判断是否交换
T temp;
temp = parr[j];
parr[j] = parr[j + 1];
parr[j + 1] = temp;
}
}
}
}
int main() {
//样例测试
int arr[] = { 1,5,64,7,2,6,1,4,5 };
BubbleSort(arr, 9,&rule_up);
for (int v : arr) {
cout << v << " ";
}
cout << endl;
double arr2[] = {1.5,5.9,7.8,1.8,1.9,7.8,4.5 };
BubbleSort(arr2, 7,&rule_down);
for (double v : arr2) {
cout << v << " ";
}
return 0;
}