2012-03-23 4 views
5

C++ 11에 도입 된 유형 안전 가변 함수를 사용하고 다른 유형에는 사용하지 않으려합니다. 예 :동일한 유형의 매개 변수를 사용하는 유형 안전 가변 함수

template<typename T> 
T maxv(T first, T second) { 
    return first > second ? first : second; 
} 

template<typename T, typename ... Rest> 
T maxv(T first, T second, T ... rest) { 
    return maxv(first, maxv(second, rest)); 
} 

모든 매개 변수의 유형은 동일합니다, 그래서 그런 걸 쓸 어쩌면 수 :

struct Point { int x,y; }; 

template<> 
Point maxv(Point first, Point second) { 
    return first.x > second.x ? first : second; 
} 

maxv({1, 2}, {3, 4});   // no problem  
maxv({1, 2}, {3, 4}, {5, 6}); // compile error 

그것은와 Mingw g ++ 4.5에서이 오류와 함께 컴파일을 :

error: no matching function for call to 'maxv(<brace-enclosed initializer list>, <brace-enclosed initializer list>, <brace-enclosed initializer list>)' 

그는 {5, 6} 유형 Point의 것을 모르기 때문에

. 해결 방안은 무엇인가?

+0

제발/변수/variadic/ –

+1

제발, 당신의 데이터가 실제로 'max_element'과 같은 무언가가 아닌 여러 아닌 집계 변수에 저장되어 있습니까? –

+0

함수를 특수화하지 말고 대신 술어를 전달하십시오. – Xeo

답변

10

가변적 인 템플릿을 사용하려면 이 아닌! 함수 템플릿과 함께 사용하면 인수의 유형을 추론 할 수 있습니다. 그것은 당신이 원하는 것이 아닙니다 : 여러분은 인자가 예상되는 타입을 취하기를 원합니다.

나는이와 함께 실제 경험이 많지 않아하지만 당신은 이것에 대한 초기화 목록을 사용할 것 :

Point maxv(std::initializer_list<Point> list) { 
    ... 
} 

당신은 다음 임의의 유형하지만 이것을 사용할 수 없다는 불평 수 당신은 당신이 어딘지 어떤 타입이 관련되어 있는지 말할 필요가 있다는 것을 깨달을 필요가 있습니다. ... 그리고 인수 유형을 지정해야하지만 템플릿으로 만들 수 있습니다.

관련 문제