템플릿 및 모호성의 자동 반환 유형


20

과부하 된 템플릿 기능이 있습니다 :

template<typename T1, typename T2>
auto overMax(T1 a, T2 b)
{
    std::cout << __FUNCSIG__ << std::endl;

    return b < a ? a : b;
}

template<typename RT, typename T1, typename T2>
RT overMax(T1 a, T2 b)
{
    std::cout << __FUNCSIG__ << std::endl;

    return b < a ? a : b;
}

내가 이것을 이렇게 부르면 :

auto a = overMax(4, 7.2); // uses first template
auto b = overMax<double>(4, 7.2); // uses second template

모든 것이 완벽하게 작동하지만

auto c = overMax<int>(4, 7.2); // error

모호한 호출을 유발합니다.

int 이고, 다른 유형은 무엇입니까?


4
내 생각 ... ... 컴파일러가 그것을 보는 방법은 다음과 같습니다과 함께 int, 당신이 지정하는 typename RT또는를 typename T1? 이후 4도입니다 int, 그것은이 될 수 있습니다. 으로 double, 4하지 않는 직접 유형과 일치 double두 번째 오버로드가 바람직 있도록.
ChrisMM

반환 유형에 과부하가 걸리지 만 매개 변수의 양이 다른 템플릿을 사용하기 때문에 다소 혼란스러워 보입니다.
Borgleader

답변:


25

RT공제 할 수 없으므로 제공하지 않을 경우에만 template<typename T1, typename T2> auto overMax(T1 a, T2 b)호출 할 수 있습니다.

하나의 템플릿 인수를 (부분적으로) 제공하면 두 방법 모두 실행 가능합니다.

그러나 논쟁에 따라 더 나은 후보가 될 수 있습니다.

  • 에 대한 auto b = overMax<double>(4, 7.2); // uses second template

    모두 overMax<double, int, double>overMax<double, double>가능한 있습니다.
    그러나 overMax<double, int, double>정확히 일치
    하는 반면 변환이 overMax<double, double>필요 int합니다 double.

  • 에 대한 auto c = overMax<int>(4, 7.2); // Ambiguous call

    모두 overMax<int, int, double>overMax<int, double>가능한 있습니다.
    그러나 더 잘 어울리거나 더 전문적이지 않으므로 전화가 모호합니다.


왜 그들 중 어느 쪽이 더 나을까요? 제 경우에는 overMax <int> (4, 7.2); 7.2 에서 int 로의 변환이 발생 합니다. 그리고 두 번째 경우 초기에 double 인 반환 결과는 명시적인 <int> 때문에 int 로 변환됩니다 .
증폭기

1
@amplifier : overMax<int>(4, 7.2)첫 번째 경우 T1=int(제공됨), T2=double( 감소됨 ) 두 번째 경우 RT=int(제공됨), T1=int, T2=double(감소됨) 두 방법 모두에 대한 내용의 정의는 과부하를 선택하는 데 사용되지 않습니다.
Jarod42

나에게는 두 번째 경우가 적합합니다. 첫 번째 경우에는 반환 유형 변환이 있고 두 번째 경우에는 전혀 변환이 없기 때문에 그렇지 않습니까?
증폭기

흠 ... 리턴 타입 변환은 역할을하지 않습니다 ... 그렇다면, 두 통화는이 관점에서 동일합니다
증폭기
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.