【发布时间】:2023-04-09 14:13:01
【问题描述】:
使用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。
【问题讨论】:
-
为什么不使用
std::min({a, b, c})、std::min({a, b, c, d, e})等?这是开箱即用的,并且是 constexpr。 -
我看不出你的第一个版本有什么问题。为什么要限制单一功能?请记住,它是一个模板,并且会为每次调用生成一个函数(使用不同的
Ts),所以这个限制似乎毫无意义。 -
@ildjarn 如果
a、b、c等复制成本很高,或者根本无法复制怎么办? -
@ildjarn 该问题与this有关。
-
标签: c++ c++14 variadic-templates min template-meta-programming