2016-08-17 9 views
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; 
} 
+0

가장 적합하고 다른 것들. 명시 적 특수화를 선택할 수 있으면 기본 템플릿으로 기본 설정됩니다. – DeiDei

+1

[부분 주문] (http://en.cppreference.com/w/cpp/language/partial_specialization#Partial_ordering)이라고합니다. – Praetorian

답변

8

두 단계가 있습니다.

  1. 기본 클래스 템플릿 : enable_if<true, int>enable_if<bool, T>과 일치합니다. 기본에 기본 인수가 있으면이 시점에 기본 인수가 채워집니다.
  2. 일치하는 기본 클래스 템플릿의 모든 특수화를 열거합니다.
    a. enable_if<bool, T>, bool=trueT=int
    b. T=int

    enable_if<true, T>, 우리는 당신이 가장 구체적인 하나를 따기로 비공식적으로 생각할 수있는 부분 순서라는 과정을 통해 가장 전문 전문성을 선택합니다. 이 경우, 모든 (2b) 인스턴스화가 (2a)와 일치 할 수 있지만 역순이 아니기 때문에 (2b)는 (2a)보다 더 구체적입니다. 따라서이 인스턴스를 선택합니다.

그래서, 당신은 T=int과 인스턴스 enable_if<true, T>와 끝까지.