std::enable_if
是 C++ 标准库中的一个模板工具,用于实现条件编译,通常用于模板编程中的SFINAE(Substitution Failure Is Not An Error)技术。std::enable_if
可以帮助你在编译时根据某些条件来启用或禁用模板实例化
template<bool B, class T = void>
struct enable_if {};
使用 std::enable_if
的场景
std::enable_if
主要用于以下几个场景:
-
条件启用函数模板
-
条件启用类模板
-
类型萃取
1. 条件启用函数模板
#include <iostream>
#include <type_traits>
// 只有当 T 是整数类型时才启用这个函数模板
template<typename T>
typename std::enable_if<std::is_integral<T>::value, void>::type
print(T value) {
std::cout << "Integer: " << value << std::endl;
}
// 只有当 T 不是整数类型时才启用这个函数模板
template<typename T>
typename std::enable_if<!std::is_integral<T>::value, void>::type
print(T value) {
std::cout << "Not an integer: " << value << std::endl;
}
int main() {
print(42); // 输出: Integer: 42
print(3.14); // 输出: Not an integer: 3.14
}
2. 条件启用类模板
#include <iostream>
#include <type_traits>
template<typename T, typename Enable = void>
class MyClass;
// 当 T 是整数类型时启用这个模板
template<typename T>
class MyClass<T, typename std::enable_if<std::is_integral<T>::value>::type> {
public:
void print() {
std::cout << "MyClass for integer type" << std::endl;
}
};
// 当 T 不是整数类型时启用这个模板
template<typename T>
class MyClass<T, typename std::enable_if<!std::is_integral<T>::value>::type> {
public:
void print() {
std::cout << "MyClass for non-integer type" << std::endl;
}
};
int main() {
MyClass<int> intClass;
intClass.print(); // 输出: MyClass for integer type
MyClass<double> doubleClass;
doubleClass.print(); // 输出: MyClass for non-integer type
}
3. 类型萃取
#include <type_traits>
template<typename T, typename Enable = void>
struct MyTrait;
// 仅当 T 是整数类型时,特化 MyTrait
template<typename T>
struct MyTrait<T, typename std::enable_if<std::is_integral<T>::value>::type> {
static const bool value = true;
};
// 其他情况下的特化
template<typename T>
struct MyTrait<T, typename std::enable_if<!std::is_integral<T>::value>::type> {
static const bool value = false;
};
int main() {
std::cout << MyTrait<int>::value << std::endl; // 输出: 1 (true)
std::cout << MyTrait<double>::value << std::endl; // 输出: 0 (false)
}