【问题标题】:General min and max - C++一般最小值和最大值 - C++
【发布时间】:2013-05-06 01:34:51
【问题描述】:

写一个通用的最小函数,我想到了两个问题。该代码适用于任何输入类型和不同的参数编号:

namespace xyz
{

template <typename T1, typename T2>
auto min(const T1 &a, const T2 &b) -> decltype(a+b)
{
    return a < b ? a : b;
}

template <typename T1, typename T2, typename ... Args>
auto min(const T1 &a, const T2 &b, Args ... args) -> decltype(a+b)
{
    return min(min(a, b), args...);
}

}

int main()
{
    cout << xyz::min(4, 5.8f, 3, 1.8, 3, 1.1, 9) << endl;
    //                   ^        ^           ^
    //                   |        |           |
    //                 float    double       int
}

 

  • decltype(a+b) 有更好的替代品吗?我想有一个我不记得的标准类,比如decltype(std::THE_RESULT&lt;a,b&gt;::type)

  • 那个decltype(std::THE_RESULT&lt;a,b&gt;::type)的返回类型是const &amp;还是不是?

【问题讨论】:

  • 您允许 a 和 b 是不同的类型对我来说似乎很奇怪。这为各种无意义的比较打开了大门,例如min(42, "three")。为什么不要求两个参数(和返回值)都是同一类型?
  • @AdrianMcCarthy: "对于算术类型,普通类型也可以看作是(可能是混合模式)算术表达式的类型,例如 T0() + T1() + 。 .. + Tn()".所以我认为,禁止使用min(42, "three")。它会导致编译错误。
  • 顺便说一句,有一篇关于使用模板重现宏版本的好的部分的文章。有很多事情要做。
  • @MM.: 是的,它会在某些组合中出现编译器错误,但也存在对一种或两种类型应用意外转换以产生不直观的风险普通类型。考虑一个混合的 int/float 比较,它会返回一个浮点数。某些整数不能在浮点数中精确表示。 min(myint, myfloat) 返回一个与参数之一不完全匹配的值会很奇怪。
  • @AdrianMcCarthy:几乎同意,但我们每天都在使用这些转换,例如myint + myfloat,这取决于程序员来处理它

标签: c++ c++11


【解决方案1】:

std::common_type(c++11):

对于非专业std::common_type,确定规则 每对 T1, T2 之间的共同类型正是规则 确定三元条件运算符的返回类型 T1T2 是它的第二个和第三个操作数的类型。

对于算术类型,普通类型也可以看作是类型 的(可能是混合模式的)算术表达式,例如T0() + T1() + ... + Tn().

不确定const&amp;,但您可以使用std::remove_cvstd::remove_reference(和std::is_reference 找出答案)。

事实上,here's 是一个类型支持实用程序的列表。把自己打晕。

【讨论】:

  • 谢谢...我添加了第三个相关问题。你介意看一下吗?
  • @MM。这会起作用,但并不完全是你想要的。对于(1,2,1.1),将返回intdecltype(min(1, 2))。您可以尝试像decltype(min(min(a, b), args...)) 这样覆盖整个内容,但现在不适用于gcc。我认为这是一个错误。
  • @MM。还有const Args&amp; ...。否则你会有简历问题。
【解决方案2】:

在得到答案和价值后,我做了如下:

template <typename T1, typename T2>
auto min(const T1 &a, const T2 &b) 
-> typename std::common_type<const T1&, const T2&>::type
{
    return a < b ? a : b;
}

template <typename T1, typename T2, typename ... Args>
auto min(const T1 &a, const T2 &b, const Args& ... args)
-> typename std::common_type<const T1&, const T2&, const Args& ...>::type
{
    return min(min(a, b), args...);
}

【讨论】:

    猜你喜欢
    • 2011-03-27
    • 2015-05-25
    • 2014-03-22
    • 1970-01-01
    • 2017-02-13
    • 2023-04-02
    • 2023-03-31
    • 2015-01-09
    相关资源
    最近更新 更多