調(diào)用模板函數(shù)時, 如果不提供參數(shù), 那么使用就是定義時指定的類型.
調(diào)用模板函數(shù)時, 如果提供參數(shù), 那么就會覆蓋掉定義時指定的類型.備注: 常規(guī)函數(shù)匹配的優(yōu)先級高于常規(guī)模板函數(shù)匹配.
?
類型替換(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); 常規(guī)函數(shù)優(yōu)先級比模板高.
example(10);
// call example(T t); 常規(guī)函數(shù)的 example(int a) 與 float 不匹配, 但是與 T (任意類型)匹配.
// 雖然 template<typename T = int> 提供了默認值, 但是編譯器還是會以傳遞參數(shù)的類型為準, 將其替換掉.
// 即: 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;
}
?
類型不替換
場景是是函數(shù)體內(nèi)聲明變量類型使用, 或者聲明返回值類型使用.
#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) {
// 調(diào)用模板函數(shù), 沒有提供任何參數(shù), 因此模板函數(shù)采用默認的參數(shù)類型 int, 并沒有產(chǎn)生任何替換任務.
auto s = example();
// output:
// template<typename T = int>example1(): int; value: 10
return 0;
}