模板 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;
}

有两个步骤。

  1. 我们匹配主 class 模板:enable_if<true, int> 匹配 enable_if<bool, T>。如果主节点上有任何默认参数,我们将在此时填充它们。
  2. 我们列举了主要 class 模板的所有特化也匹配,即:
    一种。 enable_if<bool, T>bool=trueT=int
    b. enable_if<true, T>,与 T=int

    我们通过称为部分排序的过程选择最专业 专业化,您可以非正式地将其视为选择最具体的一个。在这种情况下,(2b) 比 (2a) 更具体,因为所有 (2b) 实例都可以与 (2a) 匹配,但不能与 (2a) 相反,所以我们 select 那个。

因此,您最终得到了 enable_if<true, T>T=int 的实例化。