文章目录
1、什么是SFINAE
从这一节开始,我们才算真正踏入模板元编程的大门,前面介绍的模板编程都是为模板元编程铺路。
我们首先来了解模板元编程的一个基本规则:SFINAE,它是Substitution Failure Is Not An Error的缩写,直接翻译就是替换失败不是一个错误。
这条规则应用于函数模板重载决议时,如果模板参数展开(用户显示指定或者自动推导得到)失败,编译器并不会报错,而是从重载函数集中丢弃,也就是说会继续寻找下一个匹配函数,直接全部遍历完后还没找到匹配的函数才会报错。
这是一个使得C++模板推导规则符合程序员想象的规则。通过SFINAE,我们能够使得模板匹配更为“精确”,即 使得一些模板函数、模板类在实例化时使用特殊的模板版本,而另外一些则使用通用的版本,这样就大大增加了模板设计使用上的灵活性。
通过使用模板的特化版本并在类型匹配失败时将其从重载集合中丢弃,我们可以在模板元编程中根据不同的类型或条件执行不同的操作。这种方式可以在编译期间根据不同的类型生成不同的代码,从而实现更加灵活和高效的编程。
来看一个最基本的例子: