1、单参数模板
#include <iostream>
using namespace std;
template <typename T>
void f_swap(T &a, T &b)
{
T tmp = a;
a = b;
b = tmp;
}
int main()
{
int a = 10, b = 20;
f_swap(a,b); //隐式实例化
cout << "a: " << a << "\nb: " << b << endl;
cout << "---------------" << endl;
f_swap<int>(a,b); //显示实例化
cout << "a: " << a << "\nb: " << b << endl;
}
输出结果:
a: 20
b: 10
---------------
a: 10
b: 20
2、多参数模板
#include <iostream>
using namespace std;
template <typename T1, typename T2, typename T3>
T1 f_add(T2 &a, T3 &b)
{
T1 res;
res = static_cast<T1>(a + b);
return res;
}
int main()
{
int a = 10;
float b = 12.5;
// cout << "res: " << f_add(a,b) << endl; //编译不过,无法推到函数返回值
cout << "res: " << f_add<float>(a,b) << endl;
cout << "res: " << f_add<int,int,float>(a,b) << endl; //按声明顺序指定类型
}
输出结果:
res: 22.5
res: 22
3、函数模板和普通函数的选用优先级
- C++编译器优先考虑普通函数
- 如果函数模板可以产生一个更好的匹配,那么就选择函数模板
- 也可以通过空模板实参列表<>限定编译器只匹配函数模板
#include <iostream>
using namespace std;
template <typename T>
void fun(T a)
{
cout << "void fun(T1 a)" << endl;
}
template <typename T1, typename T2>
void fun(T1 a, T2 b)
{
cout << "void fun(T1 a, T2 b)" << endl;
}
void fun(int a, float b)
{
cout << "void fun(int a, float b)" << endl;
}
int main()
{
int a = 0;
float b = 0.0;
fun(a);
fun(a, b); //普通函数void fun(int a, float b)已经能完美匹配,于是调用普通函数
fun(b, a); //这个调用,函数模板有更好的匹配,于是调用函数模板
fun<>(a, b); //限定只使用函数模板
// system("pause");
}
输出结果:
void fun(T1 a)
void fun(int a, float b)
void fun(T1 a, T2 b)
void fun(T1 a, T2 b)