C++语法小记---函数模板

函数模板
  • 函数模板的目的是代码复用

  • 普通函数和模板函数可以形成重载,调时优先调用普通函数,其次调用模板函数

  • 模板函数要编译两次,第一次是具现出具体的函数,第二次是对具现出的函数进行编译

  • 函数模板调用特点:

    • 不进行隐式类型转换

    • 返回值不能进行自动推倒

    • 普通函数和模板函数形成重载时,可以显示的调用模板函数

  • 建议:将返回值类型作为第一个模板参数

 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 }
原文地址:https://www.cnblogs.com/chusiyong/p/11315494.html