调用模板函数时, 如果不提供参数, 那么使用就是定义时指定的类型.
调用模板函数时, 如果提供参数, 那么就会覆盖掉定义时指定的类型.备注: 常规函数匹配的优先级高于常规模板函数匹配.
类型替换(Substitution)
#include <iostream>
using std::cout;
using std::endl;
template<typename T = int> // 默认类型 int
void example(T t) {
cout << "template<typename T = " << typeid(t).name() << " > void example(T t): " << t << endl;
}
void example(int a) {
cout << "example1(int a): " << a << endl;
}
int main(void) {
// call example(int a); 常规函数优先级比模板高.
example(10);
// call example(T t); 常规函数的 example(int a) 与 float 不匹配, 但是与 T (任意类型)匹配.
// 虽然 template<typename T = int> 提供了默认值, 但是编译器还是会以传递参数的类型为准, 将其替换掉.
// 即: template<typename T = float> void example(T t);
// 生成: void example(float t);
example(10.0f);
// output:
// example1(int a): 10
// template<typename T = float > void example(): 10
return 0;
}
类型不替换
场景是是函数体内声明变量类型使用, 或者声明返回值类型使用.
#include <iostream>
using std::cout;
using std::endl;
template<typename T = int>
T example() {
T a = 10;
cout << "template<typename T = int>example1(): " << typeid(a).name() << "; value: " << a << endl;
return a;
}
int main(void) {
// 调用模板函数, 没有提供任何参数, 因此模板函数采用默认的参数类型 int, 并没有产生任何替换任务.
auto s = example();
// output:
// template<typename T = int>example1(): int; value: 10
return 0;
}