泛型编程:这个是一种编程范式,他的目的是编写适合多种数据类型的代码。
函数模版:
template<typename t>
函数的定义
我们来结合代码理解一下内容,首先定义好函数,然后我们通过方式来调用下,有两种调用函数的方式,一种是自动类型推到,另一种是显式指定类型
调用有两种模式:第一种是自动类型推导:
#include<iostream>
using namespace std;
// 函数模版
/*
template<typename T>
函数的定义
*/
template<typename T>
T ADD(T c, T d) {
T e = c + d;
return e;
}
int main() {
int a = 2, b = 3;
int c;
c = ADD(a, b);
double a1 = 2.0, b1 = 4.5;
double c1;
c1 = ADD(a1, b1);
cout << c << endl;
cout << c1 << endl;
return 0;
}
第二种是显示指定类型:
#include<iostream>
using namespace std;
// 函数模版
/*
template<typename T>
函数的定义
*/
template<typename T>
T ADD(T c, T d) {
T e = c + d;
return e;
}
int main() {
int a = 2, b = 3;
int c;
c = ADD<int>(a, b);
double a1 = 2.0, b1 = 4.5;
double c1;
c1 = ADD<double>(a1, b1);
cout << c << endl;
cout << c1 << endl;
return 0;
}
与普通函数调用区别
普通函数可以进行隐式类型转化,函数模版这里是无法进行隐式类型转化(自动类型推导),见以下代码示例:
#include<iostream>
using namespace std;
// 函数模版
/*
template<typename T>
函数的定义
*/
double adddouble(double a, double b) {
double c = a + b;
return c;
}
template<typename T>
T ADD(T c, T d) {
T e = c + d;
return e;
}
int main() {
int a = 2, b = 3;
int c;
c = ADD(a, b);
double a1 = 2.0, b1 = 4.5;
double c1;
//c1 = ADD(a1, b);// 显示报错,无法进行隐式类型转化
cout << c << endl;
cout << c1 << endl;
double cc = adddouble(2, 3);// 可以进行隐式类型转化
return 0;
}
普通函数可以进行隐式类型转化,函数模版这里是可以进行隐式类型转化(显示指定类型),见以下代码示例:
#include<iostream>
using namespace std;
// 函数模版
/*
template<typename T>
函数的定义
*/
double adddouble(double a, double b) {
double c = a + b;
return c;
}
template<typename T>
T ADD(T c, T d) {
T e = c + d;
return e;
}
int main() {
int a = 2, b = 3;
int c;
c = ADD(a, b);
double a1 = 2.0, b1 = 4.5;
double c1;
c1 = ADD<int>(a1, b);// 可以进行隐式类型转化
cout << c << endl;
cout << c1 << endl;
double cc = adddouble(2, 3);// 可以进行隐式类型转化
return 0;
}
他和普通函数的调用顺序,有那些规则呢?规则一:如果是普通函数和函数模版是同名的话,调用类型正好匹配的、都可以调用的情况下,优先调用普通函数(自动类型推导)。规则二:如果是(显示指定类型)的话,就调用函数模版,就是强制调用函数模版,见以下代码:
#include<iostream>
using namespace std;
// 函数模版
/*
template<typename T>
函数的定义
*/
double ADD(double a, double b) {
cout << "调用普通函数" << endl;
double c = a + b;
return c;
}
template<typename T>
T ADD(T c, T d) {
cout << "调用函数模版" << endl;
T e = c + d;
return e;
}
int main() {
double a1 = 2.0, b1 = 4.5;
double c1;
//c1 = ADD(a1, b1);// 优先调用普通函数
c1 = ADD<double>(a1, b1); // 强制调用函数模版
return 0;
}
规则三:如果是“不”(显示指定类型)的话,如何会调用函数模版呢?编译器在函数同名情况下,它会优先选择类型最匹配的函数,如果匹配不到的话,就会调用函数模版,见以下代码:
#include<iostream>
using namespace std;
// 函数模版
/*
template<typename T>
函数的定义
*/
int ADD(int a, int b) {
cout << "调用普通函数" << endl;
int c = a + b;
return c;
}
template<typename T>
T ADD(T c, T d) {
cout << "调用函数模版" << endl;
T e = c + d;
return e;
}
int main() {
double a1 = 2.0, b1 = 4.5;
double c1;
c1 = ADD(a1, b1);
return 0;
}