函数模板
-
函数模板的目的是代码复用
-
普通函数和模板函数可以形成重载,调时优先调用普通函数,其次调用模板函数
-
模板函数要编译两次,第一次是具现出具体的函数,第二次是对具现出的函数进行编译
-
函数模板调用特点:
-
-
返回值不能进行自动推倒
-
普通函数和模板函数形成重载时,可以显示的调用模板函数
-
-
建议:将返回值类型作为第一个模板参数
1 #include <iostream> 2 #include <string> 3 4 using namespace std; 5 6 template<typename T> 7 void Swap(T& l, T& r) 8 { 9 T tmp = l; 10 l = r; 11 r = tmp; 12 } 13 14 template<typename T> 15 T add(T l, T r) 16 { 17 cout<<"T add(T l, T r)"<<endl; 18 return l + r; 19 } 20 21 int add(int l, int r) 22 { 23 cout<<"add(int l, int r)"<<endl; 24 return l + r; 25 } 26 27 template<typename T1, typename T2> 28 T1 func(T2 param) //将返回值作为第一个参数类型 29 { 30 return static_cast<T1>(param); 31 } 32 33 int main() 34 { 35 int a = 1; 36 int b = 2; 37 Swap(a, b); 38 cout<<"a = "<<a<<endl; 39 cout<<"b = "<<b<<endl; 40 41 add(a, b); //add(int l, int r), 优先调用普通函数 42 add(1.1, 2.2); //T add(T l, T r), 普通函数不匹配,然后匹配模板函数 43 44 add<>(a, b); //显式调用模板函数 45 add<int>(a, b); //显式调用模板函数 46 47 cout<<"func<int>(1.2) = "<< func<int>(1.2) << endl; //只指定返回值类型,参数类型自动推导 48 49 return 0; 50 }
-
-
函数模板、特化模板以及普通函数可以构成重载,优先调用普通函数,其次调用特化模板,最后调用函数模板
1 #include <iostream> 2 #include <string> 3 4 using namespace std; 5 6 template<typename T1, typename T2> //函数模板 7 void add(T1 l, T2 r) 8 { 9 cout << "void add(T1 l, T2 r)" << endl; 10 } 11 12 template<> 13 void add<int>(int l, int r) //全特化模板 14 { 15 cout << "void add<int>(int l, int r)" << endl; 16 } 17 18 void add(int i, int r) //普通函数 19 { 20 cout << "void show(int i, int r)" << endl; 21 } 22 23 int main() 24 { 25 int a = 0; 26 int b = 1; 27 double c = 2.5; 28 29 add(a, b); //void show(int i, int r) 30 add<>(a, b); //void add<int>(int l, int r) 31 add(a, c); //void add(T1 l, T2 r) 32 return 0; 33 }
- 在函数模板中,类型可以是参数, 变量也可以是参数
1 #include <iostream> 2 #include <string> 3 4 using namespace std; 5 6 template<typename T1, int N> //函数模板 7 void add(T1 l, T1 r) 8 { 9 cout << "result = " << l + r <<endl; 10 cout << "N = " << N << endl; 11 } 12 13 int main() 14 { 15 add<int, 10>(1, 2); //result = 3 16 //N = 10 17 return 0; 18 }