enable_if使用

#include <iostream>

// enable_if禁用模板
/* enable_if<bool, typename=void>::type
   类型萃取:根据第一个模板参数的编译期表达式决定行为
   1.如果这个表达式为true,它的type成员会返回一个类型
    -- 如果没有第二模板参数,则返回类型为void
    -- 否则返回类型是第二个模板参数类型
   2.如果表达式为false, 则其成员类型是未定义的,根据模板的一个叫做SFINAE(替换失败不是错误)规则
    这会导致包含std::enable_if<>表达式的函数模板被忽略掉

*/
template<typename T>
typename std::enable_if<(sizeof(T)>=4)>::type func(){
    
}

// 和上面效果一样,达到enable_if第一个参数为false时禁用模板效果
// 当为true时展开为template<typename T, typename=void>
template<typename T, typename=std::enable_if_t<(sizeof(T)>=4)>>
void func1(){

}


// 也可以使用别名模板达到约束效果
template<typename T>
using EnableIfSizeGreater4=std::enable_if_t<(sizeof(T)>=4)>;

template<typename T, typename=EnableIfSizeGreater4<T>>
void func2(){

}

void Test(){
    // func<char>(); // enable_if第一个参数为false, 推断、替换模板参数失败
    // func1<char>(); // enable_if第一个参数为false, 推断、替换模板参数失败
    func<int>(); // 返回类型为void
    func1<int>(); 
    func2<int>();
}


int main(){

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值