C++如何使用std::chrono::duration作为函数参数
模板
std::chrono::duration是模板类,签名是std::chrono::duration<Rep, Period>,Rep是时间类型,Period是时间长度
错误示范
void fun(const std::chrono::seconds& value){}
void fun(const std::chrono::milliseconds& value){}
......
这样使用会很麻烦,涉及到类型转换,尤其和c语言的有关时间的结构体使用时不仅要写出多种std::chrono::duration的函数签名,还有可能在自动类型转换时溢出.
标准库的使用方法
在C++标准库中,this_thread::sleep_for函数是这样使用的,重点在类型转换的两行,优雅方便!
auto __s = chrono::duration_cast<chrono::seconds>(__rtime);
auto __ns = chrono::duration_cast<chrono::nanoseconds>(__rtime - __s);
template<typename _Rep, typename _Period>
inline void
sleep_for(const chrono::duration<_Rep, _Period>& __rtime)
{
if (__rtime <= __rtime.zero())
return;
auto __s = chrono::duration_cast<chrono::seconds>(__rtime);
auto __ns = chrono::duration_cast<chrono::nanoseconds>(__rtime - __s);
#ifdef _GLIBCXX_USE_NANOSLEEP
__gthread_time_t __ts =
{
static_cast<std::time_t>(__s.count()),
static_cast<long>(__ns.count())
};
while (::nanosleep(&__ts, &__ts) == -1 && errno == EINTR)
{ }
#else
__sleep_for(__s, __ns);
#endif
}