C++ 怎样更优雅地写max函数, 比较两个数大小?

std::max(t1, t2)
■网友
2014-12-02我同意 @邹晓航 。可以使用现成的轮子。我想补充一点我在Windows下做开发遇到的一个陷阱。MSVC的cstdlib中有两个宏:max、min。通常,在由VS代码生成向导生成的代码中,这两个宏是可以直接使用的。但是使用这两个宏存在不安全因素。比如,有一次,我在写一段MFC代码:typedef size_t Index;CArray\u0026lt;INT, const INT \u0026amp;\u0026gt; arrDataBuffer;// 向arrDataBuffer中写数据Index idealIndex = ...; // 理论上计算得到的索引值// 使用MSVC中的min宏来得到计算所得idealIndex和最大索引值两者中的最小值idealIndex = min(idealIndex, arrDataBuffer.GetUpperBound()); 因为在C++中,通常用size_t来表示一个普通数组的索引值,所以我在MFC也习惯性地用size_t表示一个索引值。问题是,CArray使用int来表示索引值。这样,当arrDataBuffer为空的时候CArray::GetUpperBound返回-1。假设我们计算得到的索引值idealIndex == 2,那么,我实际在做这样一个计算:min(-1, 2U); // no zuo no die根据c++ - Signed/unsigned comparisons提到的规则,你能想象得到我将得到什么样的结果。但是,使用std::min就没这样的问题了:std::min(-1, 2U); // 编译不通过std::min\u0026lt;int\u0026gt;(-1, 2U); // 按int比较std::min\u0026lt;size_t\u0026gt;(-1, 2U); // 按size_t比较这也是explicit is better than implicit(出自:\u0026gt;\u0026gt;\u0026gt; import this)的一个例子吧。所以,我建议在MSVC中需要min、max功能时,这样写:// maybe #include \u0026lt;cstdlib\u0026gt; or #include \u0026lt;windows.h\u0026gt; here#ifdef min# undef min#endif#ifdef max# undef max#endif#include \u0026lt;algorithm\u0026gt;// do something with std::min and std::max从我的经历,可以看到,实际上:template\u0026lt;typename T1, typename T2\u0026gt;auto max_foo(T1 const \u0026amp;t1, T2 const \u0026amp;t2)同样存在着这个陷阱(T1、T2表示它可以接受两种不同的类型啊)。我想题主本意是想:max_foo(int, long); // 返回结果为long型max_foo(int, double); // 返回结果为double型但是,只有当T1、T2两者中其中一种类型表示的数据范围完全覆盖另一种数据类型表示的范围的情况下才政治正确啊。如果T1、T2两者表示的数据范围仅仅是有交叉的话(比如unsigned int和long),max_foo就是个坑了。所以还是老老实实:template \u0026lt;typename T\u0026gt; T max(const T\u0026amp;, const T \u0026amp;)吧。2014-12-02 16:10据说C++14中增加了返回值类型自动推导,兴许彼时我们就可以优雅地:template\u0026lt;typename T1, typename T2\u0026gt;auto max_foo(T1 const \u0026amp;t1, T2 const \u0026amp;t2){ // ...}了。2015-11-25T13:02+08:00《C++ Templates: The Complete Guide》Chapter 2. Function Templates 专门拿 max 做了个例子。可以参考之。
■网友
宏定义也不错啊
■网友
不要用这种方法。


    推荐阅读