2011-09-24 4 views
2

std::min, std::max의 C++ 11 가변 버전에 대한 구현이 반영되어야합니다. 여기 std::max 그냥 std::maxstd::min를 대체하여 유사하게 구현 std::min 내 두 가지 대안은 다음과 같습니다C++ Variadic 템플릿 반영 표준 버전 : min() 및 std :: max()

/*! Multi-Type Minimum of \p a. */ 
template <LessThanComparable T> const T & multi_type_min (const T & a) { return a; } // template termination 
/*! Multi-Type Minimum of \p a and \p args. */ 
template <class T, class ... R > 
//requires SameType <T , Args >... 
T multi_type_min(const T & a, const R &... b) 
{ 
    return std::min(a, multi_type_min(b...)); 
} 

/*! Minimum of \p a. */ 
template <LessThanComparable T> const T & common_type_min(const T & a) { return a; } // template termination 
/*! Minimum of \p a and \p args. */ 
template <class T, class ... R, class C = typename boost::common_type<T, R...>::type > 
C common_type_min(const T & a, const R &... b) 
{ 
    return std::min(static_cast<C>(a), static_cast<C>(common_type_min(b...))); 
} 

우리가 전혀 common_type_min을 필요로하는 경우 핵심 문제은? 이것은 하나의 인수로 min()을 호출 할 수 있음에 유의하십시오. 이것이 혼란이나 문제를 일으킬 수 있습니까?

+0

2 개의 매개 변수를 얻을 때까지 반복 할 수 없습니까? 1 매개 변수를 구체적으로 중지 할 필요는 없습니다. –

+0

나는 그걸 어떻게하는 지 알아. 나는'std :: tuple'과 같은 컨테이너 래퍼의 알고리즘 * 일반성을 위해서'min'과'max'가 하나의 매개 변수를 취하는 것이 더 나은지 궁금했습니다. –

+0

단일 값의 최소값은 의미가 없지만 1 요소 튜플의 최소값은 의미가 있다고 말합니다. 컨테이너 타입에'min()'을 과부하하는 것이 더 나을 것입니다. –

답변

2

두 개의 매개 변수에서 멈출 때까지 재귀 적으로 작성할 수 없습니까?

/*! Multi-Type Minimum of \p a and \p args. */ 
template <class T, class U > 
//requires SameType <T , U >... 
T multi_type_min(const T & a, const U & b) 
{ 
    return std::min(a, b); 
} 

/*! Multi-Type Minimum of \p a and \p args. */ 
template <class T, class U, class ... R > 
//requires SameType <T , U, Args >... 
T multi_type_min(const T & a, const U & b, const R &... c) 
{ 
    return std::min(a, multi_type_min(b, c...)); 
} 

내가 여러 일반적인 유형이있는 경우 common_type_min 변형이 필요 같은데요 :

은 여기 (안된) 조각입니다. shortlong 값을 비교해보십시오. 형식 승격으로 인해 shortlong으로 변환되어 비교됩니다. 그러나 일부 응용 프로그램 제한 조건이나 불변성은 두 값이 모두 short으로 표시 될 수 있음을 알려줍니다. 이 경우 common_type_min<short>(a,b)을 원할 수 있습니다.

+0

이 버전의'multi_type_min'은 * right * associative라는 점에 유의하십시오. 대신 왼쪽을 선호할까요? –

+0

@ Nordlöw : 나에게 임의의 결정을하는 것처럼 보입니다. 왜 모든 비교가 왼쪽 피연산자 유형으로 수행되어야합니까? 'std :: min (1, 1.0)'은 double을 리턴해야하지 않습니까? 그렇다면'multi_type_min (1, 1, 1, 1, 1.0)'도 double을 반환하지 않아야합니까? –