2012-01-28 2 views
1
template<typename T, size_t length> void f(T (&)[length]){ 
    cout<<"array"<<endl; 
} 

template<typename T> void f(T&){ 
    cout<<"generic"<<endl; 
} 

template<typename T, typename enable_if<is_array<T>::value, int>::type =0> void f(T&){ 
    cout<<"generic (is array)"<<endl; 
} 

있는 경우가있다 (즉, 어떤 호출 Tf<T>()) 함수 서식의 최종 버전이 다른 것의 상단에 선호 될 것이다를?기능 템플릿에서 앞서 케이스

답변

2

No. T이 배열 유형 인 경우 첫 번째 버전이 두 번째 및 세 번째 기능보다 우선합니다 (그렇지 않으면 두 번째 및 세 번째 기능이 모호합니다). T이 배열 유형이 아니면 enable_if 덕분에 세 번째 기능을 사용할 수 없으며 첫 번째 기능이 일치하지 않으므로 두 번째 기능이 사용됩니다.

0

과부하 해결은 항상 함수 템플릿이 함수 템플릿인지 여부에 관계없이 함수의 인수에서만 작동합니다. 함수 템플리트의 경우 함수 템플리트가 후보인지 여부를 결정할 때 리턴 유형이 과부하 해결 전에 사용됩니다. 기본적으로 다음과 같이 작동합니다.

  1. 가능한 후보 기능 집합이 빌드입니다. 인수와 일치 할 가능성이있는 함수를 고려합니다. 함수 템플릿을 조사 할 때 함수 템플릿의 인터페이스이 추론 된 인수로 인스턴스화 될 수 있는지 여부가 결정되고 그렇지 않은 경우 함수는 오버로드 집합에 포함되지 않습니다.
  2. 일단 오버로드 세트가 빌드되면 가장 일치하는 것이 결정됩니다. 이것은 배타적으로 인수를 살펴보고 가장 많은 변환이 필요한 후보 집합에서 함수 호출을 찾으려고 시도합니다. 동점이있는 경우, 비 템플릿 함수가 선호됩니다. 단, C 스타일 가변 인수를 사용하는 함수가 가장 바람직하지 않습니다. 정확히 일치하는 것이 하나도 없다면 과부하 해결은 후보자 나 모호성을 찾지 못한다.
  3. 하여 위의 경우

f()의 구속 버전과 추론 유형이 T[N] 경우에만 인스턴스화 제한된 사람은 동등하게 좋은 경기입니다. 즉, 이것들에 T[N]을 전달하면 모호함을 가져야합니다. 그러나 템플릿 argumetns가 첫 번째 버전과 일치하도록 추론 된 경우이 템플릿은 함수 템플릿의 부분 순서 지정으로 인해 우선 순위가 높아집니다. 더 나은 일치가됩니다.

관련 문제