本文内容来自于对狄泰学院 唐佐林老师 C++深度解析 课程的学习总结
函数模板
编译器从函数模板通过具体类型 产生不同的函数
编译器会 对函数模板进行两次编译
- 对模板代码本身进行编译
- 对参数替换后的代码进行编译
注意事项:
函数模板本身 不允许隐式类型转换
- 自动推导类型时,必须严格匹配
- 显示类型指定时,能够进行隐式类型转换
实验代码
#include <iostream>
#include <string>
using namespace std;
class Test
{
Test(const Test&);
public:
Test()
{
}
};
template <typename T>
void Swap(T& a, T& b)
{
T c = a;
a = b;
b = c;
}
typedef void(FuncInt)(int&, int&);
typedef void(FuncDuoble)(double&, double&);
typedef void(FuncT)(Test&, Test&);
int main()
{
FuncInt *pi = Swap; //编译器自动推导 T为int
FuncDuoble *pd = Swap; //编译器自动推导 T为double
cout << "pi = " << reinterpret_cast<void*>(pi) << endl;
cout << "pd = " << reinterpret_cast<void*>(pd) << endl;
return 0;
}
运行结果:
函数模板可以定义 任意多个不同的类型参数
对于多参数函数模板
- 无法自动 推导返回值类型
- 可以 从左向右 部分指定类型参数
实验编程
多个参数的函数模板
#include <iostream>
#include <string>
using namespace std;
template <typename T1, typename T2, typename T3>
T1 Add(T2 a, T3 b)
{
return static_cast<T1>(a + b);
}
int main()
{
int r1 = Add<int>(0.5, 0.8);
double r2 = Add<double, int>(1, 2.0);
float r3 = Add<float, int, float>(1, 0.5);
cout << "r1 = " << r1 << endl;
cout << "r2 = " << r2 << endl;
cout << "r3 = " << r3 << endl;
return 0;
}
运行结果
实验结果:1.当函数模板有返回值时,返回类型必须显示指定
2.参数类型从左至右指定
重载函数模板
函数模板可以像普通函数一样被重载
C++ 编译器 优先考虑普通函数
如果函数模板可以产生一个 更好匹配,那么选择模板
可以通过 空模板实参列表 限定编译器只匹配模板
实例分析
重载函数模板
#include <iostream>
#include <string>
using namespace std;
template <typename T>
T Max(T a, T b)
{
cout << "T Max(T a, T b)" << endl;
return a > b ? a : b;
}
int Max(int a, int b)
{
cout << "int Max(int a, int b)" << endl;
return a > b ? a : b;
}
template <typename T>
T Max(T a, T b, T c)
{
cout << "T Max(T a, T b, T c)" << endl;
return Max(Max(a, b), c);
}
int main()
{
int a = 1;
int b = 2;
cout << Max(a, b) << endl; //重载函数
cout << Max<>(a, b) << endl; //函数模板
cout << Max(0.5, 0.8) << endl; //函数模板
cout << Max(1.0, 0.5, 1.8) << endl; //函数模板
cout << Max('a', 100) << endl; //函数模板
return 0;
}
运行结果
小结
函数模板通过具体类型 产生不同的函数
函数模板可以定义 任意多个不同的类型参数
函数模板中的 返回值类型必须显示指定
函数模板可以像普通函数一样被重载