1.模板
1.1 函数模板
函数模板不指定函数的形参类型,调用时自动确定形参的类型,可以提高函数的通用性
#include <iostream>
#include <string>
#include <fstream> /* 首先要包含头文件 */
using namespace std;
template<typename T> /* template关键字下面紧跟着的函数是函数模板,T相当于是任意类型,调用该函数时确定 */
void SwapNum(T& a, T& b)
{
T temp = a;
a = b;
b = temp;
}
template<typename T>
void TestFunc(T a, T b)
{
cout << a + b << endl;
}
void test_1(void)
{
int a = 10, b = 20;
cout << "a:" << a << " " << "b:" << b << endl;
SwapNum(a, b); /* 自动推导类型, a:20 b:10*/
cout << "a:" << a << " " << "b:" << b << endl;
char c = 'a';
// TestFunc(a, c); /* 这个时候就会报错,自动推导必须传入相同类型的变量。或者没有传参,自动推导无法确定T到底是什么类型 */
TestFunc<int>(a, c); /* 然后你随便显式指定一下类型就行了.显式指定之后是可以发生隐式类型转换的,把char转为c,这与普通函数是一样的, 117 */
}
int main(void)
{
test_1();
return 0;
}
1.2 普通函数和函数模板调用规则
当出现同名的普通函数和函数模板时,调用规则如下
- 如果普通函数和函数模板都存在,优先调用普通函数
- 加上模板函数的参数列表<>后,可以强制调用函数模板
- 函数模板也可重载
- 如果函数模板能对传入参数进行更好的匹配,就调用函数模板
但是一般项目中尽量不要写同名的普通函数和函数模板。
#include <iostream>
#include <string>
using namespace std;
void TestFunc(int a, int b)
{
cout << "调用普通函数:" << a + b << endl;
}
template<typename T> /* template关键字下面紧跟着的函数是函数模板,T相当于是任意类型,根据调用该函数时确定 */
void TestFunc(T a, T b)
{
cout << "调用函数模板:" << a + b << endl;
}
template<typename T>
void TestFunc(T a, T b, T c)
{
cout << "调用函数模板的重载函数:" << a + b + c<< endl;
}
void test_1(void)
{
int a = 10, b = 20, c = 30;
TestFunc(a, b); /* 如果普通函数和函数模板都存在,优先调用普通函数 */
TestFunc<>(a, b); /* 加上模板函数的参数列表<>后,可以强制调用函数模板 */
TestFunc<>(a, b, c); /* 函数模板也可重载 */
char c1 = 'a', c2 = 'b';
TestFunc(c1, c2); /* 如果函数模板能对传入参数进行更好的匹配,就调用函数模板 */
}
int main(void)
{
test_1();
return 0;
}
上述代码运行结果如下