std::abs 的模板版本
Template version of std::abs
Here 列出了 C++ 中 std::abs
的当前重载。我想知道为什么不只定义以下模板并放弃所有丑陋的 C 风格重载?
template <typename T> inline
T abs(const T& v) { return v < 0 ? -v : v; }
因为类型'T'可以访问包括char在内的任何数据类型。那么,如果有人将 char 传递给 abs 函数,您会期待什么。 :)
这遇到了匹配所有内容的常见问题。
abs
有意义但此实现没有意义的类型示例是 complex<double>
。
参见 LWG issue 2192。当前,如果 x
和 y
未签名,std::abs(x-y) < 2
将失败。这会捕获一个细微的编程错误。根据提议的更改,它可以编译但完全错误。 abs(3u-4u)
会比 2 大很多,实际上是 UINT_MAX
。
Here 列出了 C++ 中 std::abs
的当前重载。我想知道为什么不只定义以下模板并放弃所有丑陋的 C 风格重载?
template <typename T> inline
T abs(const T& v) { return v < 0 ? -v : v; }
因为类型'T'可以访问包括char在内的任何数据类型。那么,如果有人将 char 传递给 abs 函数,您会期待什么。 :)
这遇到了匹配所有内容的常见问题。
abs
有意义但此实现没有意义的类型示例是 complex<double>
。
参见 LWG issue 2192。当前,如果 x
和 y
未签名,std::abs(x-y) < 2
将失败。这会捕获一个细微的编程错误。根据提议的更改,它可以编译但完全错误。 abs(3u-4u)
会比 2 大很多,实际上是 UINT_MAX
。