如何将std::chrono::duration作为参数传递给函数
在下面的代码中,我如何把 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';
}
注意:在后一种情况下,Rep 和 Period 是固定的,因此如果你向函数传入一个精度较低的时长(例如通过一个 duration_cast),该函数仍将使用实现定义的 Rep 和 Period 来进行它的 steady_clock::duration。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。