C++1x中使用std::chrono获取时长滴答计数的正确方式
从现代C++编码规范角度来看,三种写法中第二种是唯一合规的选项,另外两种均存在明显缺陷,同时存在兼顾可读性和简洁度的更优实现方式。
三种写法的问题说明
- 第一种
int a = 3600;:完全不推荐。硬编码魔数的可维护性极差,注释存在和代码不同步的风险,后续调整时长、修改单位时很容易出现改漏的问题。 - 第三种
int c = (1h + 0s).count();:不推荐。属于技巧性写法,依赖std::chrono的隐式类型推导规则,不熟悉chrono库的开发者很难快速理解代码意图,违背了现代C++代码可读性优先的设计原则。 - 第二种
int b = std::chrono::duration_cast<std::chrono::seconds>(1h).count();:是三种里唯一符合规范的写法,逻辑清晰无歧义,不存在正确性风险,唯一缺点是写法稍显冗长,可以通过其他方式简化,不需要为了缩短代码牺牲可读性。
更优的实现方案
对于不存在精度损失的duration转换(比如小时转秒、分钟转秒这类整数倍的单位转换),不需要调用duration_cast,直接用目标duration类型构造即可,写法更短且逻辑同样清晰:
// 写法比duration_cast简洁很多,意图一目了然 int sec = std::chrono::seconds(1h).count();
注意:count()返回值类型通常为long long,若转换后的数值较大,直接赋值给int可能存在溢出风险,更稳妥的写法是用auto接收返回值,自动匹配正确类型:
auto sec = std::chrono::seconds(1h).count();
如果项目中频繁需要获取指定单位的滴答数,可以封装泛型工具函数进一步简化调用:
template <typename TargetDuration, typename Rep, typename Period> constexpr auto to_duration_count(const std::chrono::duration<Rep, Period>& dur) { return TargetDuration(dur).count(); } // 调用示例 auto sec = to_duration_count<std::chrono::seconds>(1h);
内容的提问来源于stack exchange,提问作者Yves
相关产品推荐
相关产品推荐

