C++11之一般化的SFINAE规则

系列文章

C++11之正则表达式(regex_match、regex_search、regex_replace)

C++11之线程库(Thread、Mutex、atomic、lock_guard、同步)

C++11之智能指针(unique_ptr、shared_ptr、weak_ptr、auto_ptr)浅谈内存管理

C++11之强制类型转换(static_cast,const_cast,dynamic_cast,reinterpret_cast)

C++11之Lanbda表达式(匿名函数)

C++11之右值引用:移动语义和完美转发(带你了解移动构造函数、纯右值、将亡值、右值引用、std::move、forward等新概念)

C++11之委派构造函数

C++11之内联名字空间(inline namespace)和ADL特性(Argument-Dependent name Lookup)

C++11之模板的别名



一般化的SFINAE规则

在C++模板中,有一条著名的规则,即SFINAE - Substitution failure is not an error,这个规则是对重载模板的参数进行展开时,如果类型不匹配,编译器也不会报错。这么说可能不直白,我们就用一个例子说明吧。

重载函数模板

在下面这个例子中,我们对模板函数f进行重载。第一个模板的参数为T::foo,第二个模板参数是一个T类型。然后分别使用Test类和int类型对模板f函数进行实例化,对于f<int>来说,并不存在int::foo类型,但编译器不会报错,而是继续寻找匹配的模板版本。

#include <iostream>

using namespace std;

class Test
{
public:
	typedef int foo;
};

template <typename T>
void f(typename T::foo){}// 第一个模板定义

template <typename T>
void f(T){} // 第二个模板定义

int main()
{
	f<Test>(10);
	f<int>(1);
	return 0;
}

其实,通过这么一个简单的例子,我们就可以明白SFINAE规则的作用。一句话就是使得C++模板推导的规则符合程序员的预期结果,更加灵活。支持一些特殊的版本,还能使用通用的版本。

总结

在C++11标准对这样的状况,尤其是模板参数替换时使用了表达式的情况进行了明确规定,即表达式中没有出现“外部于表达式本身”的元素,比如说发生一些模板的实例化,或者隐式地产生一些拷贝构造函数的话,这样的模板推导都不会产生
SFINAE 失败(即编译器报错)。这样一来,C++11中的一些新特性将能够成功地进行广泛的应用,进一步地,新的STL也将因此受益。

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林夕07

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值