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