enable_if

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"; }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值