一般最小和最大 - C ++

时间:2013-05-11 14:12:45

标签: c++ c++11

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

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 &

2 个答案:

答案 0 :(得分:13)

std::common_typec++11):

  

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

  

对于算术类型,也可以将公共类型视为类型   (可能是混合模式)算术表达式,例如T0() + T1() + ... + Tn().

不确定const&,但您可以使用std::remove_cvstd::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...);
}