C++11新特性enable_if与SFINAE用法解析

SFINAE

SDINAE的全称是Substitution failure is not an error。意思是“匹配失败并非错误”

通常,在使用模板时,编译器会根据传入的参数来推导最适合的模板函数,在这个推导过程中只要有一个可以正确推导出来(但是不能有多个,否则会引起歧义),那么其他几个模板推导就是会产生编译错误,程序也可以正常通过。如下面的代码所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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<Test>(10); // Call #1.
f<int>(10); // Call #2. Without error (even though there is no int::foo)
//thanks to SFINAE.
}

std::enable_if

这是一个模板类,该模板可能的实现如下:(也许会有其他版本,但大意都差不多)

1
2
3
4
5
template<bool B, class T = void>
struct enable_if {}; //在C++中,struct和class除了默认访问权限不同外,无任何差异

template<class T>
struct enable_if<true, T> { typedef T type; };

以上表示,若B为true,则std::enable_if模板类拥有公开成员typedef type ,等于T;否则,无该成员。