std::enable_if的用法:
std::enable_if为一个结构模板,使用的时候可以指定两个模板参数
enable_if<bool, _Tp>,若bool为true,内部会进行typedef _Tp type,即将_Tp定义成了type
通过enable_if<true, _Tp>::type进行指定,type与_Tp是一个意思!
std::is_intergral<int>::value = 1
std::is_integral<float>::value = 0
typename std::enable_if<std::is_intergral<T>::value>::type
1. 作为返回类型
可以enable_if对函数模板进行条件限制,当条件为真时,enable_if可以启用函数模板,否则禁用函数模板,
#include <type_traits> #include <iostream> template <typename T> typename std::enable_if<std::is_integral<T>::value, T>::type foo(T x) { std::cout << "foo int"; return x * 2; } template <typename T> typename std::enable_if<std::is_floating_point<T>::value, T>::type foo(T x) { std::cout << "foo float"; return x / 2.0; }
2. 用于参数列表
根据不同条件选择不同参数列表
template <typename T> void bar(T x, typename std::enable_if<std::is_integral<T>::value>::type* = nullptr) { std::cout << "bar int"; // 处理整型参数的函数实现 } template <typename T> void bar(T x, typename std::enable_if<std::is_floating_point<T>::value>::type* = nullptr) { std::cout << "bar float"; // 处理浮点型参数的函数实现 }
3. 控制类模板实例化
在满足某些条件之下,才能实例化这个模板
通过对第二个模板参数进行限制,控制类的实例化
当使用enable_if对类模板进行条件限制时,要将第二个参数模板命名为Enable
#include <type_traits> #include <iostream> template <typename T, typename Enable = void> class MyClass { // 默认实现,适用于所有类型 public: MyClass<T>() { std::cout << "default"; } }; template <typename T> class MyClass<T, typename std::enable_if<std::is_integral<T>::value>::type> { // 整型类型的特化实现 public: MyClass<T>() { std::cout << "int"; } }; template <typename T> class MyClass<T, typename std::enable_if<std::is_floating_point<T>::value>::type> { // 浮点型类型的特化实现 public: MyClass<T>() { std::cout << "float"; } };