2

我尝试理解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;
}
4

1 回答 1

8

有两个步骤。

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

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

因此,您最终会得到enable_if<true, T>一个T=int.

于 2016-08-17T21:05:32.923 回答