Размышления о вариативных шаблонах C ++ версий std :: min () и std :: max () - PullRequest
2 голосов
/ 24 сентября 2011

Мне нужны размышления о моих реализациях вариативных версий C ++ 11 std::min, std::max.Вот мои две альтернативы для std::min, где std::max реализован аналогично, просто заменив std::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 () с одним аргументом.Может ли это вызвать путаницу или проблемы?

1 Ответ

2 голосов
/ 24 сентября 2011

Разве вы не можете просто написать это так, чтобы оно повторялось, пока вы не остановитесь на двух параметрах?

Вот (непроверенный) фрагмент:

/*! 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 вариант необходим, когда есть несколько общих типов.Попробуйте сравнить значения short и long.Из-за повышения типа short будет преобразовано в long для сравнения.Однако некоторое ограничение или инвариант приложения может дать вам знать, что оба значения могут быть представлены short.В этом случае вы можете захотеть иметь common_type_min<short>(a,b).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...