使用C++ chrono计时,输出time_since_epoch结果编译报错求助
解决C++中std::chrono::duration无法直接输出的问题
问题核心是:std::chrono::high_resolution_clock::now().time_since_epoch()返回的std::chrono::duration类型,C++标准库未提供默认的std::ostream输出重载,因此cout无法直接处理该类型对象。
以下是几种可行的修复方案:
1. 转换为具体时间单位的计数值输出
通过duration_cast将duration转换为目标时间单位(如微秒、毫秒),再调用count()获取数值输出:
#include <chrono> #include <iostream> int main() { auto t = std::chrono::high_resolution_clock::now(); auto since_epoch = t.time_since_epoch(); // 输出纳秒(high_resolution_clock默认精度) std::cout << since_epoch.count() << " nanoseconds\n"; // 转换为微秒输出 std::cout << std::chrono::duration_cast<std::chrono::microseconds>(since_epoch).count() << " microseconds\n"; // 转换为毫秒输出 std::cout << std::chrono::duration_cast<std::chrono::milliseconds>(since_epoch).count() << " milliseconds\n"; }
count()返回整数类型,可被cout直接输出;duration_cast用于不同时间单位的转换,按需选择即可。
2. 自定义ostream重载实现通用输出
若需频繁输出duration,可自定义operator<<让cout支持直接打印任意duration类型:
#include <chrono> #include <iostream> // 模板重载,适配所有duration类型 template<typename Rep, typename Period> std::ostream& operator<<(std::ostream& os, const std::chrono::duration<Rep, Period>& d) { // 转换为秒并保留小数,提升可读性 using Seconds = std::chrono::duration<double>; return os << std::chrono::duration_cast<Seconds>(d).count() << " seconds"; } int main() { auto t = std::chrono::high_resolution_clock::now(); std::cout << t.time_since_epoch() << '\n'; }
之后直接使用cout << duration即可输出格式化后的时间。
3. 用C++20的std::format原生支持(推荐)
C++20的std::format原生支持chrono类型格式化输出,无需额外处理:
#include <chrono> #include <iostream> #include <format> int main() { auto t = std::chrono::high_resolution_clock::now(); std::cout << std::format("{}\n", t.time_since_epoch()); }
注意:使用libc++编译时,部分版本需添加-fexperimental-library启用实验特性,编译命令改为:
clang++ -std=c++20 -stdlib=libc++ -fexperimental-library test3.cpp -o test5
内容的提问来源于stack exchange,提问作者Abm
相关产品推荐
相关产品推荐

