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 做了个例子。可以参考之。
■网友
宏定义也不错啊
■网友
不要用这种方法。
推荐阅读
- 聪明人养花,这3种“花”怎样也要养一盆,每年能省不少医药费
- 互联网怎样解决“家政服务上门速度慢”的问题
- 怎样看待从1月8号起,QQ钱包开始提现收费
- 银行it人怎样转型
- 汽车|冬天怎样让车内温度快速升高?座椅加热的最佳使用方式二,外循环的作用总结
- 怎样进入通信行业
- 怎样评价扶他柠檬茶的小说《云养汉》的结尾
- 怎样成为一名合格的Python程序员?
- 怎样评价华为、诺基亚、中兴中标中国移动高端路由交换设备扩容集采
- 怎样评价类似前橙会、百老汇、南极圈这样类型的离职帮抱团,对企业的积极意义和消极意义