接受std::chrono::任何表示/周期的持续时间
Accepting std::chrono::duration of any representation/period
我希望函数接受对调用者有意义的任何单位的持续时间。
例如:transition->after(chrono::seconds(3));
transition->after(chrono::milliseconds(500));
transition->after(chrono::hours(1));
这个after
函数的有效签名是什么样子的?我能避免使它成为模板化函数吗?
有几个常见的选项
1)使用模板。这样做的优点是不需要转换,但需要使用模板,而这可能是不可能的。例如,如果这是一个虚函数的接口
template<typename Rep, typename Period>
void after( std::chrono::duration< Rep, Period > t);
2)使用整数表示,以及接口所需的最低周期。例如,如果您的函数实际上只需要纳秒,那么可以直接使用它。如果不发生精度损失,这将隐式地转换为纳秒。您可以使用预定义的周期来指定其他周期,或者显式地将其指定为持续时间
的一部分。void after( std::chrono::nanoseconds t) ;
3)使用双重表示,如果精度不是问题,但接受所有输入的能力是问题,这可能是有用的。这将隐式地转换任何持续时间,因为所有周期都允许转换为浮点类型。例如,如果想要双精度秒数,可以使用
void after( std::chrono::duration< double > t);
从c++17开始,我们可以使用std::variant
。
void after(std::variant<std::chrono::minutes, std::chrono::seconds> dt)
在after
函数中,您可以使用std::visit
来避免代码重复。在下面的示例中,我们将给定的持续时间添加到"3秒":
void after(std::variant<std::chrono::minutes, std::chrono::seconds> dt) {
std::chrono::seconds secs{3};
std::visit([&secs](auto v)
{ secs += v; }, dt);
}
相关文章:
- 从持续时间构造std::chrono::system_clock::time_point
- 我有一个对象,它将在整个程序的持续时间内实例化,但一个类成员不会,我应该动态分配它吗?
- 时间持续时间到时间字符串
- 指向(数据)成员的指针作为非类型模板参数,例如具有自动存储持续时间/无链接
- 为什么具有静态存储持续时间的同一内联变量在包含在 VS2017 编译的两个翻译单元中时会构造和销毁两次
- 将毫秒转换为给定格式的持续时间
- 具有静态存储持续时间的常量初始化变量的初始化顺序
- 划分和乘以STD :: Chrono ::持续时间
- 静态存储持续时间初始化
- C++计划持续时间内(字体)资源的分配
- FFMPEG:具有不同持续时间的多路复用流
- 在不同翻译单元中具有静态存储持续时间的依赖非局部常量浮点变量的常量初始化
- 使用System_Clock :: TO_TIME_T警告持续时间_t
- 访问和存储/解析性std :: Chrono ::持续时间:: milliseconds(cpprest)时使用什么类型
- 我可以让QT到概要文件插槽执行持续时间吗?
- 在STD :: Chrono ::剩余时间测量的持续时间
- 自定义 AVIOContext 的未定义 AVFormatContext 持续时间
- 使用计时比较C++的持续时间/秒数并不像预期的那样工作
- 为什么 std::future::wait_for 不等待正确的持续时间
- 接受std::chrono::任何表示/周期的持续时间