C++ 函數模板可以簡化代碼的編寫,特別是在需要處理多種數據類型且代碼邏輯相似的情況下。通過使用函數模板,你可以編寫一個通用的函數,該函數可以處理不同類型的數據,而無需為每種數據類型編寫單獨的函數。以下是一些使用 C++ 函數模板簡化代碼的示例:
你可以編寫一個函數模板來計算兩個數的和,無論這兩個數是整數還是浮點數。
template <typename T>
T add(T a, T b) {
return a + b;
}
使用這個函數模板,你可以像這樣計算不同類型數的和:
int main() {
int a = 3, b = 4;
float x = 1.5, y = 2.5;
std::cout << add(a, b) << std::endl; // 輸出 7
std::cout << add(x, y) << std::endl; // 輸出 4
return 0;
}
你可以使用函數模板來編寫一個通用的交換函數。
template <typename T>
void swap(T& a, T& b) {
T temp = a;
a = b;
b = temp;
}
使用這個函數模板,你可以交換不同類型變量的值:
int main() {
int a = 3, b = 4;
float x = 1.5, y = 2.5;
swap(a, b); // 交換 a 和 b 的值
swap(x, y); // 交換 x 和 y 的值
std::cout<< a << ", "<< b << std::endl; // 輸出 4, 3
std::cout<< x << ", "<< y << std::endl; // 輸出 2.5, 1.5
return 0;
}
std::enable_if
和 SFINAE:有時你可能需要根據模板參數的類型啟用或禁用函數模板的某些特化。你可以使用 std::enable_if
和 SFINAE(Substitution Failure Is Not An Error)來實現這一點。
例如,假設你只想為整數類型啟用一個特定的函數模板特化:
#include <iostream>
#include <type_traits>
template <typename T, typename std::enable_if<std::is_integral<T>::value, int>::type = 0>
void print_integral(T value) {
std::cout << "The value is an integral type: " << value << std::endl;
}
int main() {
int a = 42;
double b = 3.14;
print_integral(a); // 輸出 "The value is an integral type: 42"
// print_integral(b); // 編譯錯誤,因為 B 不是整數類型
return 0;
}
在這個例子中,std::enable_if
使用 std::is_integral<T>::value
來檢查 T
是否為整數類型。如果 T
是整數類型,std::enable_if
的第二個模板參數將有一個有效的默認值,并且函數模板將變得可用。否則,編譯器將不會生成該函數的實例,并在嘗試使用它時產生編譯錯誤。