文章目錄
- 前言
- 一、什么是泛型編程
- 二、函數模板
- 三、函數模板的使用
- 四、多參數函數模板
- 五,示例代碼:
- 總結
前言
當需要編寫通用的代碼以處理不同類型的數據時,C++ 中的函數模板是一個很有用的工具。函數模板允許我們編寫一個通用的函數定義,可以用于多種不同的數據類型,從而提高代碼的重用性和靈活性。
一、什么是泛型編程
泛型編程 是一種編程范式,旨在實現可重用、通用性高的代碼。它允許我們編寫與特定數據類型無關的代碼,使代碼能夠適用于多種不同的數據類型。
- 傳統的編程 方法主要依賴于特定的數據類型,需要為每個數據類型編寫特定的代碼。
- 在泛型編程中,我們使用泛型類型來表示不特定的數據類型,可以在代碼中使用泛型類型作為參數、變量或返回類型。使用泛型類型,我們可以編寫通用的算法和數據結構,使其能夠適用于不同的數據類型。
泛型編程的核心概念是模板
。模板是一種代碼生成機制,可以根據具體的數據類型生成對應的代碼。C++中的模板可以是函數模板或類模板。函數模板允許我們定義通用的函數,而類模板允許我們定義通用的類。
二、函數模板
- 函數模板 概念:
- 一種特殊的函數 可用不同類型去調用。
- 看起來喝普通的函數相似,區別是
類型可被參數化
。
- 函數模板規則:
template 關鍵字用于聲明開始進行泛型編程
。
typename 關鍵字用于聲明泛指類型
.
T 是泛指任意的數據類型。
下面是一個 用于交換 數據的函數模板。
三、函數模板的使用
- 自動類型推導調用。
自動推導類型時,必須嚴格匹配。
int a = 1;
int b = 2;Swap(a, b); // 自動推導
- 具體類型顯示調用。
顯示類型指定時,能夠進行隱式類型轉化。
顯式指定函數模板的參數類型,而不是依賴編譯器的類型推導。這可以通過在函數調用中使用尖括號來實現.
float c = 2.1;
float d = 3.1;Swap<float>(c, d); // 顯示調用
四、多參數函數模板
多參數函數模板 就是 函數模板定義任意多個不同的參數類型。
對于多參數模板, 無法自動推導返回值的類型。可以從左到右 部分指定類型參數。
工程中 將第一個類型參數 作為 返回值參數類型。
例如:計算 a ,b 之和。
using namespace std;template <typename T1, typename T2, typename T3>
T1 Add(T2 a, T3 b)
{return static_cast<T1>(a+b);
}int main(void)
{// T1 = int, T2 = double, T3 = doubleint r1 = Add<int>(0.6, 0.7); // 第一個參數類型 作為 返回值類型,從左往右推// T1 = double, T2 = float, T3 = doubledouble r2 = Add<double, float>(0.6, 0.7);// T1 = float, T2 = float, T3 = floatfloat r3 = Add<float, float, float>(0.6, 0.7);cout << "r1 = " << r1 << endl;cout << "r2 = " << r2 << endl;cout << "r3 = " << r3 << endl;return 0;
}
注意
:
當 函數模板遇到了 普通函數,C++ 編譯器優先選擇 普通函數。如果函數模板可以產生更厚的匹配,則選擇模板。可以通過 < > 限定編譯器只匹配模板。
五,示例代碼:
通過下面的例子進一步講解:
使用 函數模板 分別對整形數組 和 字符串數組 進行排序 打印。
using namespace std;template <typename T> // 函數模板:交換數據
void Swap(T& a, T& b)
{T c = a;a = b;b = c;
}template<typename T>
void Sort(T a[], int len) // 函數模板:數組元素排序
{for (int i = 0; i < len; i++){for (int j = i; j < len; j++){if (a[i] > a[j])Swap(a[i],a[j]);}}
}int main(void)
{int a[5] = {3,5,1,2,4};for (int i = 0; i < 5; i++)cout << a[i] << ",";cout << endl;Sort(a,5); // 數組元素排序for (int j = 0; j < 5; j++)cout << a[j] << ",";cout << endl;string s[5] = { "Java", "C++", "Pascal", "Ruby", "Basic" };for (int k = 0; k < 5; k++)cout << s[k] << ",";cout << endl;Sort(s, 5); // 字符串 數組排序for (int n = 0;n < 5;n++)cout << s[n] << ",";cout << endl;return 0;
}
總結
以上是對C++函數模板的詳細解析。函數模板提供了一種強大的機制,可以編寫與數據類型無關的通用代碼,從而提高代碼的重用性和靈活性,以及更好地支持泛型編程。