C++ chrono中`s`/`ns`等时间字面量及运算符重载问题咨询
C++ chrono库中的时间字面量及运算符相关问题解答
咱们先搞清楚你提到的s、10s这些标记到底是什么——它们是C++11及之后标准库chrono提供的用户定义字面量,目的是让咱们能快速创建不同时间单位的std::chrono::duration对象,不用手动写冗长的类型构造代码。具体对应关系如下:
s:秒单位的字面量,对应std::chrono::seconds类型,1s就代表1秒的时长对象10s:直接表示10秒的std::chrono::seconds实例ns:纳秒单位,对应std::chrono::nanoseconds,1ns就是1纳秒10ns:10纳秒的std::chrono::nanoseconds对象ms:毫秒单位,对应std::chrono::milliseconds,1ms等价于1000000纳秒10ms:10毫秒的std::chrono::milliseconds实例h:小时单位,对应std::chrono::hours,1h就是1小时10h:10小时的std::chrono::hours对象min:分钟单位,对应std::chrono::minutes,1min代表1分钟10min:10分钟的std::chrono::minutes实例
需要注意的是,这些字面量默认不在全局命名空间里,你得引入std::literals::chrono_literals命名空间(或者写using namespace std::chrono_literals;)才能直接用1s这种写法,不然编译器会认不出这些标记。
再来说你关心的第二个问题:能不能用字母作为运算符,或者对它们进行重载?
首先明确一点:C++不允许你直接用普通字母作为新的运算符——运算符只能是语言规定的那些符号(比如+、-、*、/这类),你没法凭空创造一个operator s()这种形式的运算符。不过咱们可以通过其他方式实现类似的便捷效果:
- 重载现有运算符适配duration
chrono库本身已经给duration类型提供了很多运算符支持,比如10s + 500ms会自动做单位转换并算出结果;如果你有特殊需求,也可以重载现有运算符,比如让自定义类型和duration进行运算,举个简单例子:
#include <chrono> using namespace std::chrono_literals; // 重载自定义类型和duration的加法 struct MyTime { int val; }; MyTime operator+(const MyTime& mt, std::chrono::seconds s) { return {mt.val + static_cast<int>(s.count())}; } // 使用:MyTime t{5}; auto res = t + 3s;
- 自定义用户定义字面量
如果默认的字面量不够用,你可以自己扩展,比如定义一个代表“天”的d字面量:
#include <chrono> constexpr std::chrono::hours operator""d(unsigned long long days) { return std::chrono::hours(days * 24); } // 使用时:auto two_days = 2d; // 等价于48小时
简单总结:没法用字母当新运算符,但可以通过重载现有运算符、自定义字面量来实现类似的便捷写法,满足你的使用需求。
内容的提问来源于stack exchange,提问作者dev65
相关产品推荐
相关产品推荐

