Это расширение стандартной функции std::max
, поэтому оно может принимать произвольное количество аргументов.По умолчанию параметр после пакета параметров
template<typename T, typename U, typename Compare = std::greater<>> constexpr
const auto max(const T& first, const U& second, Compare comp = Compare())
{
return comp(first, second) ? first : second;
}
template<typename T, typename U, typename... Pack, typename Compare = std::greater<>> constexpr
const auto max(const T& first, const U& second, const Pack&... rest, Compare comp = Compare())
{
return comp(first, second) ? max(first, rest..., comp) : max(second, rest..., comp);
}
Как я понимаю, параметр comp
примет значение последнего аргумента, с которым я называю эту функцию.
Я не прав? Что я могу сделать с этим?
std::cout << max(2, 3, 4, 5); //boom
std::cout << max(2, 3, 4, 5, std::greater<>()); //boom
Конечно, это работает отлично, если удалить comp
полностью.
'rest' находится в невыводимом контексте. (Это во многом почему «вариационная» версия 'std :: max' принимает' initializer_list'.) –
Таким образом, это непрактично. Попробуйте что-нибудь еще. (Я могу заставить ваш код работать, но он включает в себя sfinae гимнастику и метапрограммирование, и даже тогда, если у вас есть параметр, который поддерживает '()' и '<' it breaks). Сделайте версию сравнения имеющей другое имя и сначала сравните ее. – Yakk