Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 模板类是如何匹配的_C++_Templates_C++11_Template Classes - Fatal编程技术网

C++ 模板类是如何匹配的

C++ 模板类是如何匹配的,c++,templates,c++11,template-classes,C++,Templates,C++11,Template Classes,我试图理解enable_if实现,它是一对模板类。我不明白的是,如果与第一个不匹配,为什么要启用?这是如何决定的 #include <iostream> template <bool, class T = void> struct enable_if { enable_if() { std::cout << "invalid type";} }; template <class T> struct enable_if<true,

我试图理解
enable_if
实现,它是一对模板类。我不明白的是,如果与第一个不匹配,为什么要启用?这是如何决定的

#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;
}
#包括
模板
结构启用\u如果
{
启用_if(){std::cout有两个步骤

  • 我们匹配主类模板:
    enable_if
    匹配
    enable_if
    。如果主类上有任何默认参数,我们将在此时填充它们
  • 我们列举了同样匹配的主类模板的所有专门化,即:
    a、
    启用_如果
    ,使用
    bool=true
    T=int

    b、
    启用\u如果
    ,使用
    T=int

    我们通过一个称为偏序的过程来选择最专业化的专门化,你可以非正式地认为这是选择最具体的一个。在这种情况下,(2b)比(2a)更具体,因为所有(2b)实例化都可以与(2a)匹配,但不能与(2a)相反,所以我们选择了那个


  • 因此,您最终得到一个实例化
    enable\u if
    T=int

    Best-fit以及其他东西。如果可以选择显式专门化,则默认为基本模板。它被称为