c++ - 返回多个值中最小值的 min() 的简洁实现

标签 c++ c++14 variadic-templates min template-meta-programming

使用std::min(),我们可以std::min(a, b)。但是,如果我想要 min(a, b, c)min(a, b, c, d, e) 怎么办?我知道以下实现工作:

template <typename T>
const T& min(const T& x, const T& y) {
  return x < y ? x : y;
}

template <typename T, typename... Ts>
const T& min(const T& x, const T& y, const Ts&... xs) {
  return min(min(x, y), xs...);
}

但我想要一个简洁的函数(当然,前提是它完全可行)。我试过以下方法

using std::swap;
template <typename T, typename... Ts>
const T& min(const T& x, const T& y, const Ts&... xs) {
  return min(min(x, y), xs...);
}

这不适用于 min(1, 2, 3)。如果我可以只导入 std::swap() 的特定重载,这个问题就可以解决,不幸的是,这在当前的 C++ 中似乎是不可能的。所以,我想问,是否有一个简洁的实现仅通过一个函数就可以实现我想要的?请注意,我正在考虑 C++14。请不要使用 C++1z。

最佳答案

我会咬:

#include <initializer_list>
#include <algorithm>
#include <functional>

template<template<typename> class CompT = std::less, typename T, typename... Ts>
T const& variadic_min(T const& a, T const& b, Ts const&... ts) {
    return std::min({ std::cref(a), std::cref(b), std::cref(ts)... }, CompT<T>{});
}

Online Demo

还可以添加适当的 static_assert 以在并非所有类型都相同的情况下改进错误消息。

关于c++ - 返回多个值中最小值的 min() 的简洁实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34990336/

相关文章:

c++ - boost::bimap 中的移位值

performance - std::optional <T>的开销?

c++ - 将 std::tuple 转换为 std::set

c++ - operator = 在不同维度的 vector 上

c++ - 如何使用这些类型的变量名

安装 (centos) 时出现 rstan C++14 错误

c++ - 使用 C++ 可变参数模板,如何存储一组异构类型的对象并迭代它们?

c++ - 可变模板函数

c++ - 为什么我必须通过this指针访问模板基类成员?

c++ - FFMPEG Audio解码并绘制波形