C++:模版(1)——:SFINAE和std::enable_if

本文介绍了C++中的SFINAE原则,它允许在模板函数重载中,如果某个模板实例化导致编译错误,则不选择该版本,而尝试其他可能的模板。同时,讲解了std::enable_if作为模板编译开关的角色,如何与SFINAE结合,用于在编译时检查类是否定义了特定内嵌类型,并提供了相关的代码示例进行说明。
摘要由CSDN通过智能技术生成

在函数模板的重载决议中应用此规则:当将模板形参替换为显式指定的类型或推导的类型失败时,从重载集中丢弃这个特化,而非导致编译失败。 此 特 性 被 用 于 模 板 元 编 程 。 \color{red}此特性被用于模板元编程。

SFINAE(substitution failure is not an erro)

SFINAE是英文Substitution failure is not an error的缩写,意思是 匹 配 失 败 不 是 错 误 \color{red}匹配失败不是错误

这句话什么意思呢?当调用模板函数时编译器会根据传入参数推导最合适的模板函数,在这个推导过程中如果某一个或者某几个模板函数推导出来是编译无法通过的,只要有一个可以正确推导出来,那么那几个推导得到的可能产生编译错误的模板函数并不会引发编译错误。这段话很绕,我们接下来用代码说明一下,一看便知。

选择函数的正确编译版本,“忽略”错误的版本

struct Test {
   
    typedef int foo;
};

template <typename T> 
void f(typename T::foo) {
   } // Definition #1

template <typename T> 
void f(T) {
   }               // Definition #2

int main() {
   
    f&
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值