минимальный и максимальный вариант шаблона Variadic в C ++ 11? - PullRequest
7 голосов
/ 29 мая 2011

Прав ли я при чтении стандарта, что из min и maxminmax в этом отношении) есть новые initializer_list вариантов, но нет Variadic Template варианты?

Таким образом, это нормально:

int a = min( { 1,2,a,b,5 } );

, но это не так:

int b = min( 1,2,a,b,5 ); // err!

Я думаю, многие люди ожидают, что шаблоны Variadic могут легкореализовали это, поэтому они могут быть разочарованы.

Я бы сказал, что использование VT для min и max было бы излишним

  • шаблонов вариаций способны обрабатывать несколько типов
  • списки инициализаторов проверить, что все типы одинаковы по конструкции

, поэтому IL гораздо лучше подходят для этой задачи.

Верна ли моя интерпретация?

Ответы [ 4 ]

10 голосов
/ 29 мая 2011

Ваша интерпретация верна. N2772 содержит более подробное обоснование.

1 голос
/ 19 сентября 2011

Вот мое решение, использующее шаблоны с переменным числом аргументов и без него. *1001* Общие характеристики типа для min протестировано на GCC 4.6. Я не уверен, если это нужно для common_type или нет.

#define LessThanComparable class
#include <boost/type_traits/common_type.hpp>


/*! 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, \p b and \p args. */
template <class T, class ... R >
//requires SameType <T , Args >...
T multi_type_min(const T & a, const T & b, const R &... args)
{
    return multi_type_min(a < b ? a : b, args...);
}

/*! Minimum of \p a. */
template <LessThanComparable T> const T & min(const T & a) { return a; } // template termination
/*! Minimum of \p a, \p b and \p args. */
template <class T, class U, class ... R, class C = typename boost::common_type<T, U, R...>::type >
C min(const T & a, const U & b, const R &... c)
{
    return min(static_cast<C>(a < b ? a : b), static_cast<C>(c)...);
}
0 голосов
/ 10 сентября 2018

Объединив шаблон variadic и initializer_list, мы можем позволить функции int b = min( 1,2,a,b,5 ); работать без рекурсивного развертывания.

template <class T>
T _real_min_(T a, std::initializer_list<T> s) {
    T *res = &a;
    for (auto it = s.begin(); it != s.end(); ++it) {
        *res = *(it) < *res ? *it : *res;
    }
    return *res;
}

template <class T, class... ArgTypes>
T min(T a, ArgTypes... args) {
  return _real_min_(a, {args...});
}
0 голосов
/ 29 мая 2011

Да, я думаю, будет справедливо сказать, что наличие всех значений совместимых типов делает списки хорошим кандидатом на эту функцию. Это не значит, что вы не можете написать собственную версию шаблона с переменным числом аргументов.

...