2012-11-25 5 views
13

저는이 문제에 대한 답변을 찾기 위해 Google에서 주위를 둘러 보았습니다. 그러나이 행동에 대해 이야기하는 사람을 찾을 수 없어 정확한 용어로 검색하지 않아야합니다. 나는 템플릿 함수의 부분적인 스펙이 C++ 표준의 일부인지 또는 컴파일러가 특정적인 것인지 여부를 알아 내려고하고있다.C++의 부분 템플릿 함수 사양이 작동하지만 그 이유는 무엇입니까?

부분 지정으로 컴파일러에서 추론 할 수없는 형식 만 지정하면됩니다.

#include <iostream> 
#include <tuple> 
#include <string> 

template<class A, class B, class C> 
std::tuple<A, B> test(C c) 
{ 
    // do something based on c, return tuple with types A and B 
    return std::make_tuple(A(), B()); 
} 

int main(void) 
{ 
    // I expected I would have to use this form. Specify all parameters. 
    std::tuple<int, int> value3 = test<int, int, int>(5); 

    // Here, I only specified the return value types, did not specify the parameter type, yet it compiles. 
    auto value1 = test<int, int>("c-string"); 

    // Similar example here. Return types specified, parameter type deduced. Compiles fine. 
    auto value2 = test<std::string, int>(42); 

    return 0; 
} 
: 나는 템플릿 기능 3 가지를 소요되며, 하나는 매개 변수에 사용되며 추론 할 수있다 'F'를해야한다면, 나는 형태 여기 f<type, type>(parameter)

와 'F'를 부를 수있는 것은 예입니다

g ++ 4.5.3, g ++ 4.6.3, VS2010 및 VS2012로 테스트했습니다. 컴파일러가 널리 지원하는 것 같기 때문에 표준의 일부가 될 것이라고 확신하지만 누구나 확인할 수 있습니까? 누구든지이 링크가 작동하는 이유를 설명하는 리소스에 대한 링크 또는 포인터가 있습니까?

는 감사

+0

왜 이것이 작동하지 않아야한다고 생각하는지 설명하지 않았습니다. 여기에 어떤 질문도 없습니다. 어쨌든, 당신은 인수 공제에 대해 말하고 있습니다. 이것은 확실히 새로운 것이 아닙니다. –

+0

당신이 찾고있는 것 같아요 : http://cpp0x.centaur.ath.cx/temp.deduct.call.html – yonilevy

+0

그래, 그건 정확히 yonilevy. 감사. –

답변

14

단락

"(14.8.2)을 추론 할 수있는 템플릿 인수를 후행하는 것은 명시 적으로 템플릿 인수 목록에서 생략 할 수있는 C++ 03 표준 상태의 14.8.1.2 . "

+0

이것은 내가 찾던 확인이다, 고마워. –

+0

이 문제를 해결하려면 : 인수 목록의 중간에있는 템플릿 인수를 추론 할 수있는 방법이 있습니까? 선행 인수에서 추론 할 수 있지만 후속 인수를 명시 적으로 지정해야합니까? – haelix

+0

나는 OP 코드에서와 같은 의미이지만 함수가'template std :: tuple test (C c)'로 선언 되었다면'test (3.14)' – haelix