写一般的最小函数,我想到了两个问题。代码适用于任何输入类型和不同的参数编号:
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 &
?
答案 0 :(得分:13)
std::common_type
(c++11
):
对于非专业的
std::common_type
,确定的规则 每对T1
之间的共同类型,T2
正是其中的规则 确定三元条件运算符的返回类型T1
和T2
是第二个和第三个操作数的类型。
和
对于算术类型,也可以将公共类型视为类型 (可能是混合模式)算术表达式,例如
T0() + T1() + ... + Tn().
不确定const&
,但您可以使用std::remove_cv
和std::remove_reference
(以及std::is_reference
来查找答案)。
实际上,here's是一个类型支持实用程序列表。把自己弄出来。
答案 1 :(得分:5)
在答案和值得评论后,我按照以下方式做了:
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...);
}