2013-05-23 8 views
3

이 예제에서는 tuple의 템플릿 매개 변수 유형을 공제 할 수 있습니까? 튜플의 템플릿 매개 변수를 중괄호 초기화에서 유추 할 수 있습니까?

#include<tuple> 
#include<string> 

template<class T1, class T2> 
void fun(std::tuple<T1, T2> t, std::string other){} 

int main(){ 
    fun(std::tuple<double, int>(2.,3), std::string("other")); // ok 
    fun(std::make_tuple(2.,3), std::string("other")); // ok, but trying to avoid `make_tuple` 
    fun({2.,3},std::string("other")); // desired syntax but 
    // giving compilation error: candidate template ignored: couldn't infer template argument 'T1' void fun(std::tuple<T1, T2> t) 
} 

는 I 함수 fun 레벨에서 가변 인자를 포함하는 용액을 방지하기 위해 두 번째 인수 other 첨가. 또한 적어도 사용자 코드 (예 : main())에서 make_tuple의 사용을 피하려고합니다. 실제로 "원하는 구문"이 허용되는 한 관련된 유형 인 tuple 유형 일 필요는 없으며 나중에 어떻게 요소 유형을 추후 단계에서 추론 할 수 있습니다.

그것은 적어도 clang 3.2gcc 4.7.2 실패

(또한 유사하지만,이는 괄호에있는 모든 가진 서로 다른 요소에서 작동하지 않기 때문에 initializer_list 함께 할 수 없다). 현재 또는 가까운 장래의 표준에서 효과가있을 것이라는 희망이 있습니까? (예를 들어, 미래() initializer_tuple?.)

(이 하위 요소를 통합하여, 통화 기능 표현력을 추가하는 것은 매우 유용 할 수 있지만,이에 대한 주장 할 수있다)


참고 : 예를 들어, 코드는 std::forward_as_tuplestd::make_tuple보다 적합하므로 인수가 반드시 복사되지는 않습니다 : http://en.cppreference.com/w/cpp/utility/tuple/forward_as_tuple. 이기종 이니셜 라이저 목록을위한 내장 언어 기능이있는 것처럼 아직 좋지 않습니다.

+0

명백하게 절대적으로 방법이 없습니다 (sic). 'initializer_tuple' 언어 기능을 추가하는 것에 대해 의견이 있으십니까? – alfC

답변

1

아니요, 절대적으로 없습니다. 요소 유형이 동일한 유형이 아니면 공제가 실패합니다. 그리고 매개 변수가 어쨌든 std::initializer_list<T>이 아닌 경우 전혀 공제가 수행되지 않습니다 (사용자가 제공 한 중괄호와 아무 관계가 없지만 이것이 공제를위한 간단한 규칙 임).

템플릿 매개 변수 값은 매개 변수 값이 포함 된 다른 함수 매개 변수 위치에 의해 추론되어야하며 명시 적으로 지정해야합니다.

+0

당신의 답변은 언어 제한에 관한 진술이고 '튜플'이나'initializer_list'에 구현 된 것의 제한이 아니라고 해석합니다. 맞습니까? 그럼, 절대적으로 지금은 심지어 다른 튜플과 같은 유형을 사용합니까? C++ 2X가 될 때까지 기다려야합니다. – alfC