模板类是如何匹配的

时间:2016-08-17 21:00:46

标签: c++ templates c++11 template-classes

我尝试理解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 个答案:

答案 0 :(得分:8)

有两个步骤。

  1. 我们匹配主要类模板:enable_if<true, int>匹配enable_if<bool, T>。如果主数据库上有任何默认参数,我们此时会填充它们。
  2. 我们枚举了也匹配的主类模板的所有特化,即:
    一个。 enable_if<bool, T>bool=trueT=intenable_if<true, T>T=int

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

  3. 因此,您最终会使用enable_if<true, T>进行实例化T=int