C++ 模板元編程是一種在編譯時執行計算的技術,它利用 C++ 模板系統來實現。模板元編程可以用于生成編譯時常量、類型選擇和算法優化等。為了在模板元編程中區分不同的類型或值,我們可以使用以下方法:
#include <type_traits>
template <typename T, typename std::enable_if<std::is_integral<T>::value, int>::type = 0>
void foo(T t) {
// 這個函數只接受整數類型
}
template <typename T, typename std::enable_if<std::is_floating_point<T>::value, int>::type = 0>
void foo(T t) {
// 這個函數只接受浮點類型
}
#include <iostream>
template <typename T>
struct Foo {
static void print() {
std::cout << "通用實現" << std::endl;
}
};
template <>
struct Foo<int> {
static void print() {
std::cout << "整數特化" << std::endl;
}
};
template <>
struct Foo<double> {
static void print() {
std::cout << "浮點數特化" << std::endl;
}
};
int main() {
Foo<int>::print(); // 輸出 "整數特化"
Foo<double>::print(); // 輸出 "浮點數特化"
return 0;
}
std::is_same
、std::is_integral
、std::is_floating_point
等類型萃取可以用來在編譯時檢查類型的屬性。我們可以使用這些類型萃取來區分不同的類型。例如:#include <iostream>
#include <type_traits>
template <typename T>
void foo() {
if constexpr (std::is_same_v<T, int>) {
std::cout << "整數類型" << std::endl;
} else if constexpr (std::is_same_v<T, double>) {
std::cout << "浮點數類型" << std::endl;
} else {
std::cout << "其他類型" << std::endl;
}
}
int main() {
foo<int>(); // 輸出 "整數類型"
foo<double>(); // 輸出 "浮點數類型"
foo<std::string>(); // 輸出 "其他類型"
return 0;
}
通過使用這些方法,我們可以在 C++ 模板元編程中區分不同的類型或值。