一、普通函數(shù) 與 函數(shù)模板 的調用規(guī)則 - 類型匹配
1、類型匹配
上一篇博客 【C++】泛型編程 ② ( 函數(shù)模板與普通函數(shù)區(qū)別 ) 中 , 分析了 函數(shù)參數(shù) 類型匹配 下的 普通函數(shù) 與 函數(shù)模板 的調用規(guī)則 ;
為 函數(shù)模板 重載了 普通函數(shù) , 普通函數(shù)有指定的類型 ;
// 使用 template 關鍵字 聲明函數(shù)模板
// 告訴 C++ 編譯器 開始使用 泛型編程
// 定義的 T 是泛型類型
// 聲明了多個泛型, 可以只使用其中的部分類型
// 使用函數(shù)模板時 , 顯式類型調用 必須 顯式指定所有 泛型類型 的實際類型
template <typename T>
T add(T a, T b) {
cout << "調用函數(shù)模板 T add(T a, T b)"<< endl;
return a + b;
}
// 函數(shù)模板的 重載函數(shù)
// 重載是發(fā)生在 同一個作用域中
// 重寫是發(fā)生在 父類 與 子類 之間
// C++ 編譯器優(yōu)先 調用 符合要求的 普通函數(shù)
// 如果普通函數(shù)不符合要求 , 則考慮調用 函數(shù)模板
int add(int a, int b) {
cout << "調用普通函數(shù) int add(int a, int b)" << endl;
return a + b;
}
傳入實參 , 調用 普通函數(shù) 還是 模板函數(shù) , 是有一定的規(guī)則的 ;
普通函數(shù) 與 傳入實參 類型匹配的 情況下 , 優(yōu)先調用 普通函數(shù) ,
如果 普通函數(shù) 無法匹配 則考慮調用 函數(shù)模板 ;
2、代碼示例 - 類型匹配
代碼示例 :
#include "iostream"
using namespace std;
// 使用 template 關鍵字 聲明函數(shù)模板
// 告訴 C++ 編譯器 開始使用 泛型編程
// 定義的 T 是泛型類型
// 聲明了多個泛型, 可以只使用其中的部分類型
// 使用函數(shù)模板時 , 顯式類型調用 必須 顯式指定所有 泛型類型 的實際類型
template <typename T>
T add(T a, T b) {
cout << "調用函數(shù)模板 T add(T a, T b)"<< endl;
return a + b;
}
// 函數(shù)模板的 重載函數(shù)
// 重載是發(fā)生在 同一個作用域中
// 重寫是發(fā)生在 父類 與 子類 之間
// C++ 編譯器優(yōu)先 調用 符合要求的 普通函數(shù)
// 如果普通函數(shù)不符合要求 , 則考慮調用 函數(shù)模板
int add(int a, int b) {
cout << "調用普通函數(shù) int add(int a, int b)" << endl;
return a + b;
}
// 普通函數(shù) , 函數(shù)模板 調用 優(yōu)先級
// 函數(shù)模板 會進行 嚴格類型匹配 , 不會進行 類型轉換 ;
//
// 如果 符合 普通函數(shù)類型參數(shù)要求 , 優(yōu)先調用普通函數(shù) ;
// 如果 沒有 符合要求的 普通函數(shù) , 則查看 模板函數(shù) 能否匹配 ;
// 如果 模板函數(shù) 仍不能匹配 , 則查看 普通函數(shù) 類型轉換能否匹配 ;
int main() {
int a = 10, b = 20;
// 調用普通函數(shù)
// 如果符合普通函數(shù)要求 優(yōu)先調用普通函數(shù)
int c = add(a, b);
cout << "c = " << c << endl;
double x = 50.0, y = 60.0;
// 調用函數(shù)模板
// 函數(shù)模板 自動類型推導
double z = add(x, y);
cout << "z = " << z << endl;
// 控制臺暫停 , 按任意鍵繼續(xù)向后執(zhí)行
system("pause");
return 0;
}
執(zhí)行結果 :
調用普通函數(shù) int add(int a, int b)
c = 30
調用函數(shù)模板 T add(T a, T b)
z = 110
Press any key to continue . . .
二、普通函數(shù) 與 函數(shù)模板 的調用規(guī)則 - 顯式指定函數(shù)模板泛型類型
1、顯式指定函數(shù)模板泛型類型
如果 函數(shù)調用時 , 顯式指定函數(shù)模板類型 , 也就是在尖括號 <>
中指定了泛型類型 ,
此時 即使 參數(shù)類型 能 匹配 普通函數(shù) ,
也要調用 函數(shù)模板 ;
在下面的代碼示例中 , 傳入的實參類型 都是 int 類型 , 完全符合 普通函數(shù)的 調用規(guī)則 ,
但是 使用 <int>
顯示指定了 函數(shù)模板 的 泛型類型 ,
此時必須使用 函數(shù)模板 ;
int i = 30, j = 40;
// 調用函數(shù)模板
// 函數(shù)模板 顯式類型調用
int k = add<int>(i, j);
cout << "k = " << k << endl;
2、代碼示例 - 顯式指定函數(shù)模板泛型類型
代碼示例 :
#include "iostream"
using namespace std;
// 使用 template 關鍵字 聲明函數(shù)模板
// 告訴 C++ 編譯器 開始使用 泛型編程
// 定義的 T 是泛型類型
// 聲明了多個泛型, 可以只使用其中的部分類型
// 使用函數(shù)模板時 , 顯式類型調用 必須 顯式指定所有 泛型類型 的實際類型
template <typename T>
T add(T a, T b) {
cout << "調用函數(shù)模板 T add(T a, T b)"<< endl;
return a + b;
}
// 函數(shù)模板的 重載函數(shù)
// 重載是發(fā)生在 同一個作用域中
// 重寫是發(fā)生在 父類 與 子類 之間
// C++ 編譯器優(yōu)先 調用 符合要求的 普通函數(shù)
// 如果普通函數(shù)不符合要求 , 則考慮調用 函數(shù)模板
int add(int a, int b) {
cout << "調用普通函數(shù) int add(int a, int b)" << endl;
return a + b;
}
// 普通函數(shù) , 函數(shù)模板 調用 優(yōu)先級
// 函數(shù)模板 會進行 嚴格類型匹配 , 不會進行 類型轉換 ;
//
// 如果 符合 普通函數(shù)類型參數(shù)要求 , 優(yōu)先調用普通函數(shù) ;
// 如果 沒有 符合要求的 普通函數(shù) , 則查看 模板函數(shù) 能否匹配 ;
// 如果 模板函數(shù) 仍不能匹配 , 則查看 普通函數(shù) 類型轉換能否匹配 ;
int main() {
int a = 10, b = 20;
// 調用普通函數(shù)
// 如果符合普通函數(shù)要求 優(yōu)先調用普通函數(shù)
int c = add(a, b);
cout << "c = " << c << endl;
// 調用函數(shù)模板
// 函數(shù)模板 顯式類型調用
int k = add<int>(a, b);
cout << "k = " << k << endl;
// 控制臺暫停 , 按任意鍵繼續(xù)向后執(zhí)行
system("pause");
return 0;
}
執(zhí)行結果 :
調用普通函數(shù) int add(int a, int b)
c = 30
調用函數(shù)模板 T add(T a, T b)
k = 30
Press any key to continue . . .文章來源:http://www.zghlxwxcb.cn/news/detail-831613.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-831613.html
到了這里,關于【C++】泛型編程 ③ ( 函數(shù)模板 與 普通函數(shù) 調用規(guī)則 | 類型匹配 | 顯式指定函數(shù)模板泛型類型 )的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!