我尝试理解enable_if
实现,它是一对模板类。我不明白,为什么enable_if<true, int>
与第一个不匹配?这是怎么决定的?
#include <iostream>
template <bool, class T = void>
struct enable_if
{
enable_if() { std::cout << "invalid type";}
};
template <class T>
struct enable_if<true, T>
{
typedef T type;
enable_if() { std::cout <<"valid type";}
};
int main(){
enable_if<0==0, int> example; // print "valid type"
return 0;
}
答案 0 :(得分:8)
有两个步骤。
enable_if<true, int>
匹配enable_if<bool, T>
。如果主数据库上有任何默认参数,我们此时会填充它们。 我们枚举了也匹配的主类模板的所有特化,即:
一个。 enable_if<bool, T>
,bool=true
和T=int
湾enable_if<true, T>
,T=int
我们通过称为部分排序的过程选择最专业的专业化,您可以非正式地将其视为挑选最具体的一个。在这种情况下,(2b)比(2a)更具体,因为所有(2b)实例都可以匹配(2a)而不是相反,所以我们选择那个。
因此,您最终会使用enable_if<true, T>
进行实例化T=int
。