接受std :: chrono ::任何表示/期间的持续时间

Dre*_*kes 12 c++ c++11

我想要一个函数来接受对调用者有意义的任何单位的持续时间.

例如:

transition->after(chrono::seconds(3));
transition->after(chrono::milliseconds(500));
transition->after(chrono::hours(1));
Run Code Online (Sandbox Code Playgroud)

这个after函数的有效签名是什么样的?我可以避免使它成为模板化的功能吗?

Dav*_*e S 25

有一些常见的选择

1)使用模板.这样做的优点是没有转换,但需要使用模板,这可能是不可能的.例如,如果这是虚拟功能的接口.

template<typename Rep, typename Period>
void after( std::chrono::duration< Rep, Period > t);
Run Code Online (Sandbox Code Playgroud)

2)使用整数表示,以及您的接口所需的最低周期.例如,如果您的函数实际上只需要纳秒,那么您可以直接使用它.如果不会发生精度损失,这将隐式转换为纳秒.您可以使用预定义的期间指定其他期间,或者将其明确指定为持续时间的一部分

void after( std::chrono::nanoseconds t) ;
Run Code Online (Sandbox Code Playgroud)

3)使用双重表示,如果精度不是问题,但是接受所有输入的能力是有用的.这将隐式转换任何持续时间,因为所有时段都允许转换为浮点类型.例如,如果你想要双精度秒,你就可以

void after( std::chrono::duration< double > t);
Run Code Online (Sandbox Code Playgroud)

  • 从 c++20 开始,也可以执行 `void after( std::chrono::duration&lt;auto&gt; t);` :) (3认同)