g++7.5无法输出std::chrono::duration<double,std::milli>的替代方案咨询
适配g++ 7.5.0的std::chrono::duration流输出替代方案
你遇到的错误是因为cppreference上的示例使用了C++20才引入的std::chrono::duration流输出运算符,而g++ 7.5.0(Ubuntu 18.04默认版本)仅支持到部分C17特性,没有实现这个运算符。以下是几种适配C11/C++17的替代方案:
方案1:手动输出数值与单位
这是最简单直接的方式,直接调用duration::count()获取数值,再手动拼接单位字符串:
#include <chrono> #include <iostream> int main() { auto start = std::chrono::high_resolution_clock::now(); // 模拟耗时操作 for (int i = 0; i < 1000000; ++i) {} auto end = std::chrono::high_resolution_clock::now(); std::chrono::duration<double, std::milli> elapsed = end - start; // 手动输出数值+单位 std::cout << "Elapsed time: " << elapsed.count() << " ms\n"; }
编译命令:
g++ -std=c++11 your_code.cpp -o your_program
方案2:通用输出函数(C++17版本)
如果需要处理多种duration类型,可写一个带if constexpr的模板函数,自动识别单位并输出:
#include <chrono> #include <iostream> #include <type_traits> template <typename Rep, typename Period> std::ostream& print_duration(std::ostream& os, const std::chrono::duration<Rep, Period>& dur) { using namespace std::chrono; if constexpr (std::is_same_v<Period, nano>) { os << dur.count() << " ns"; } else if constexpr (std::is_same_v<Period, micro>) { os << dur.count() << " µs"; } else if constexpr (std::is_same_v<Period, milli>) { os << dur.count() << " ms"; } else if constexpr (std::is_same_v<Period, std::ratio<1>>) { os << dur.count() << " s"; } else if constexpr (std::is_same_v<Period, std::ratio<60>>) { os << dur.count() << " min"; } else { // 处理自定义单位,输出比例 os << dur.count() << " [" << Period::num << "/" << Period::den << "] units"; } return os; } int main() { auto start = std::chrono::high_resolution_clock::now(); for (int i = 0; i < 1000000; ++i) {} auto end = std::chrono::high_resolution_clock::now(); auto elapsed_ms = std::chrono::duration<double, std::milli>(end - start); std::cout << "Elapsed time: "; print_duration(std::cout, elapsed_ms); std::cout << '\n'; auto elapsed_us = std::chrono::duration<double, std::micro>(end - start); std::cout << "Elapsed time (micro): "; print_duration(std::cout, elapsed_us); std::cout << '\n'; }
编译命令:
g++ -std=c++17 your_code.cpp -o your_program
方案3:通用输出函数(C++11兼容版本)
如果必须使用C++11,可通过模板特化实现同样的功能:
#include <chrono> #include <iostream> // 基础模板:处理未特化的单位 template <typename Rep, typename Period> std::ostream& print_duration(std::ostream& os, const std::chrono::duration<Rep, Period>& dur) { os << dur.count() << " [" << Period::num << "/" << Period::den << "] units"; return os; } // 特化毫秒单位 template <typename Rep> std::ostream& print_duration(std::ostream& os, const std::chrono::duration<Rep, std::milli>& dur) { os << dur.count() << " ms"; return os; } // 特化微秒单位 template <typename Rep> std::ostream& print_duration(std::ostream& os, const std::chrono::duration<Rep, std::micro>& dur) { os << dur.count() << " µs"; return os; } // 特化秒单位 template <typename Rep> std::ostream& print_duration(std::ostream& os, const std::chrono::duration<Rep, std::ratio<1>>& dur) { os << dur.count() << " s"; return os; } int main() { auto start = std::chrono::high_resolution_clock::now(); for (int i = 0; i < 1000000; ++i) {} auto end = std::chrono::high_resolution_clock::now(); auto elapsed_ms = std::chrono::duration<double, std::milli>(end - start); std::cout << "Elapsed time: "; print_duration(std::cout, elapsed_ms); std::cout << '\n'; }
编译命令:
g++ -std=c++11 your_code.cpp -o your_program
内容的提问来源于stack exchange,提问作者CroCo
相关产品推荐
相关产品推荐

