如何将std::chrono::duration作为参数传递给函数

编程语言 2026-07-09

在下面的代码中,我如何把 std::chrono::duration 类型作为参数传递给一个函数?在 main 函数内部,我能够声明一个类型为 std::chrono::duration 的变量,但在把相同的参数传递给函数时会抛出错误。有人能解释这种行为吗?

#include <chrono>
#include <iostream>
#include <thread>

// throws an error here
void foo(const std::chrono::duration& d) {
    std::cout << d.count() << std::endl;
}

int main() {
    const auto s = std::chrono::steady_clock::now();
    std::this_thread::sleep_for(std::chrono::seconds(3));
    const auto e = std::chrono::steady_clock::now();
    // doesn't throw an error here
    const std::chrono::duration d = e - s;
    std::cout << d.count() << std::endl;
}

错误

<source>:5:10: error: missing template argument list after 'std::chrono::duration'; template placeholder not permitted in parameter
    5 | void foo(const std::chrono::duration& d) {
      |          ^~~~~
      |               <>
<source>:5:10: note: or use 'auto' for an abbreviated function template
In file included from /cefs/38/383ad2f84cbd57a52fd68bbe_consolidated/compilers_c++_x86_gcc_16.1.0/include/c++/16.1.0/chrono:51,
                 from <source>:1:
/cefs/38/383ad2f84cbd57a52fd68bbe_consolidated/compilers_c++_x86_gcc_16.1.0/include/c++/16.1.0/bits/chrono.h:68:13: note: 'template<class _Rep, class _Period> class std::chrono::duration' declared here
   68 |       class duration;
      |             ^~~~~~~~
<source>: In function 'void foo(...)':
<source>:6:18: error: 'd' was not declared in this scope
    6 |     std::cout << d.count() << std::endl;
      |                  ^
Compiler returned: 1

解决方案

std::chrono::duration 不是一个具体类型,而是一个类模板:

template<
    class Rep,
    class Period = std::ratio<1>
> class duration;

如果你想让你的函数接受该类模板的所有可能实例化,通常会把该函数改造成一个函数模板。

示例:

template <class Rep, class Period>
void foo(const std::chrono::duration<Rep, Period>& d) {
    std::cout << d << '\n';
}

如果你只对支持 steady_clock::duration 感兴趣:

void bar(const std::chrono::steady_clock::duration& d) {
    std::cout << d << '\n';
}

注意:在后一种情况下,RepPeriod 是固定的,因此如果你向函数传入一个精度较低的时长(例如通过一个 duration_cast),该函数仍将使用实现定义的 RepPeriod 来进行它的 steady_clock::duration

演示

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章