You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 03:17:26