std::enable_if定义及使用

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. 条件启用函数模板

  2. 条件启用类模板

  3. 类型萃取

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)
}

  • 8
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值