模板 class 是如何匹配的
how is template class matched
我试图理解 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;
}
有两个步骤。
- 我们匹配主 class 模板:
enable_if<true, int>
匹配 enable_if<bool, T>
。如果主节点上有任何默认参数,我们将在此时填充它们。
我们列举了主要 class 模板的所有特化也匹配,即:
一种。 enable_if<bool, T>
,bool=true
和 T=int
b. enable_if<true, T>
,与 T=int
我们通过称为部分排序的过程选择最专业 专业化,您可以非正式地将其视为选择最具体的一个。在这种情况下,(2b) 比 (2a) 更具体,因为所有 (2b) 实例都可以与 (2a) 匹配,但不能与 (2a) 相反,所以我们 select 那个。
因此,您最终得到了 enable_if<true, T>
和 T=int
的实例化。
我试图理解 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;
}
有两个步骤。
- 我们匹配主 class 模板:
enable_if<true, int>
匹配enable_if<bool, T>
。如果主节点上有任何默认参数,我们将在此时填充它们。 我们列举了主要 class 模板的所有特化也匹配,即:
一种。enable_if<bool, T>
,bool=true
和T=int
b.enable_if<true, T>
,与T=int
我们通过称为部分排序的过程选择最专业 专业化,您可以非正式地将其视为选择最具体的一个。在这种情况下,(2b) 比 (2a) 更具体,因为所有 (2b) 实例都可以与 (2a) 匹配,但不能与 (2a) 相反,所以我们 select 那个。
因此,您最终得到了 enable_if<true, T>
和 T=int
的实例化。