函數模板做函數參數


一、函數模板申明、生成及注意事項

1.1函數模板申明

函數模板可以用來創建一個通用的函數,以支持多種不同的形參,避免重載函數的函數體重復設計。它的最大特點是把函數使用的數據類型作為參數。

函數模板的聲明形式為:

  template<typename 數據類型參數標識符>

  <返回類型><函數名>(參數表)

    {

        函數體

    }

  其中,template是定義模板函數的關鍵字;template后面的尖括號不能省略;typename(或class)是聲明數據類型參數標識符的關鍵字,用以說明它后面的標識符是數據類型標識符。這樣,在以后定義的這個函數中,凡希望根據實參數據類型來確定數據類型的變量,都可以用數據類型參數標識符來說明,從而使這個變量可以適應不同的數據類型。

函數模板只是聲明了一個函數的描述即模板,不是一個可以直接執行的函數,只有根據實際情況用實參的數據類型代替類型參數標識符之后,才能產生真正的函數。關鍵字typename也可以使用關鍵字class,這時數據類型參數標識符就可以使用所有的C++數據類型。

1.2模板函數的生成

  函數模板的數據類型參數標識符實際上是一個類型形參,在使用函數模板時,要將這個形參實例化為確定的數據類型。將類型形參實例化的參數稱為模板實參,用模板實參實例化的函數稱為模板函數。模板函數的生成就是將函數模板的類型形參實例化的過程。

1.3函數模板使用應注意問題

  1)函數模板允許使用多個類型參數,但在template定義部分的每個形參前必須有關鍵字typename或class,即:

    template<class 數據類型參數標識符1,…,class 數據類型參數標識符n>

    <返回類型><函數名>(參數表)

    {

         函數體

    }

  2)在template語句與函數模板定義語句<返回類型>之間不允許有別的語句。如下面的聲明是錯誤的:

1 template<class T>
2 int I;
3 T min(T x,T y)
4 
5 {
6 
7    函數體
8 
9 }

  3)模板函數類似於重載函數,但兩者有很大區別:函數重載時,每個函數體內可以執行不同的動作,但同一個函數模板實例化后的模板函數都必須執行相同的動作。

二、函數模板的調用

函數模板調用通常有兩種調用方式:

  1)myswap<float>(a,b);//顯示類型調用;

  2)myswap(a,b);//自動數據類型推導;

三、函數模板做參數實例

  3.1對一個數組進行排序,未使用模板

 1 #include<iostream>
 2 using namespace std;
 3 
 4 //排序整型數組、字符串數組
 5 int mySort(int *arr, int len)
 6 {
 7     int tmp = 0;
 8     if (arr==NULL)
 9     {
10         return -1;
11     }
12     for (int i = 0; i < len; i++)
13     {
14         
15         for (int j = i+1; j < len; j++)
16         {
17             if (arr[i]<arr[j])
18             {
19                 tmp = arr[i];
20                 arr[i] = arr[j];
21                 arr[j] = tmp;
22             }
23         }
24     }
25 
26     return 0;
27 }
28 int myPrint(int *arr,int len)
29 {
30     
31     for (int i = 0; i < len; i++)
32     {
33         cout << arr[i] << "    " ;
34     }
35     cout << endl;
36     return 0;
37 }
38 void main()
39 {
40     int arr[] = {11,33,4,55,66,78,98};
41     int size = sizeof(arr) / sizeof(*arr);
42     printf("排序之前\n");
43     myPrint(arr,size);
44     printf("排序之后\n");
45     mySort(arr, size);
46     myPrint(arr,size);
47     system("pause");
48 }

3.2函數模板做參數實例

 1 #include<iostream>
 2 using namespace std;
 3 
 4 //排序整型數組、字符串數組
 5 template<typename T,typename T2>
 6 int mySort(T *arr, T2 len)
 7 {
 8     T tmp = 0;
 9     if (arr==NULL)
10     {
11         return -1;
12     }
13     for (T i = 0; i < len; i++)
14     {
15         
16         for (T j = i+1; j < len; j++)
17         {
18             if (arr[i]<arr[j])
19             {
20                 tmp = arr[i];
21                 arr[i] = arr[j];
22                 arr[j] = tmp;
23             }
24         }
25     }
26 
27     return 0;
28 }
29 template<typename T, typename T2>
30 int myPrint(T *arr,T len)
31 {
32     
33     for (T i = 0; i < len; i++)
34     {
35         cout << arr[i] << "    " ;
36     }
37     cout << endl;
38     return 0;
39 }
40 void main()
41 {
42     int arr[] = {11,33,4,55,66,78,98};
43     int size = sizeof(arr) / sizeof(*arr);
44     printf("排序之前\n");
45     myPrint<int ,int >(arr,size);//顯示調用
46     printf("排序之后\n");
47     mySort(arr, size);//自動調用
48     myPrint<int,int>(arr,size);
49     system("pause");
50 }

 四、函數模板與普通函數的差異

  1)函數模板不允許自動類型轉換;

  2)普通函數能夠進行自動類型轉換。

  函數模板可以像普通函數一樣被重載,如果一個程序中同時存在函數模板和普通函數,C++編譯器有限考慮調用普通函數,如果函數模板可以產出更好的匹配,則選擇函數模板。

 1 #include<iostream>
 2 using namespace std;
 3 
 4 int Max(int a, int b)
 5 {
 6     cout << "int max(int a,int b)" << endl;
 7     return a > b ? a : b;
 8 }
 9 
10 template<typename T>
11 T Max(T a, T b)
12 {
13     cout << "T max(T a,T b)" << endl;
14     return a > b ? a : b;
15 }
16 
17 template<typename T>
18 T Max(T a, T b, T c)
19 {
20         cout << "T Max(T a, T b, T c)" << endl;
21         return a > b ? a : b;
22 }
23 void main()
24 {
25     int a = 10;
26     int b = 20;
27     cout << Max(a,b) << endl;//當函數模板和普通函數都符合調用規則,優先選擇普通函數
28     cout << Max<>(a, b) << endl;//若顯示使用函數模板,則調用函數模板
29     cout << Max(1.0, 2.0, 3.0) << endl;//函數的重載
30     cout << Max('a', 100);//調用普通函數,可以隱式轉換
31     system("pause");
32


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM