【发布时间】:2020-09-15 17:37:11
【问题描述】:
在我正在使用的 C++14 项目中
#include <algorithm>
using std::max; // for max(a,b)
但我还想提供一个max() 函数,它接受任意数量的参数(相同类型)。为此,我添加了
template<typename T, typename...A>
constexpr inline T const& max(T const&x, T const&y, A...&&z)
{
return max(max(x,y), std::forward<A>(z)...);
}
但是在打电话时
double x,y,z;
...
auto m = max(x,y,z);
编译器试图代替我的重载使用
namespace std {
template< class T, class Compare >
constexpr const T& max( const T& a, const T& b, Compare comp );
}
来自algorithm。我怎样才能避免这种情况(但仍提供预期的功能)?
(请注意,有一个question about variadic min/max,但它并不能解决我的问题,只需将名称更改为vmin/vmax。)
【问题讨论】:
-
std::max有一个重载,它采用初始化列表。也许这对你有用? en.cppreference.com/w/cpp/algorithm/max -
不要做
using std::max——到处使用显式命名空间解析。 -
@RetiredNinja 这不是一个解决方案,因为它没有提供预期的功能。同样适用于 wochran 的评论。
-
需要注意的是,之所以调用std::max重载是因为double可以隐式转换为bool,这使得重载比解包参数包并继续扩展
-
@mkamerath 为什么是布尔值?
标签: c++ c++14 variadic-templates overload-resolution