更一般的实施。
template<typename Duration>
void to_timeval(Duration&& d, struct timeval & tv) {
std::chrono::seconds const sec = std::chrono::duration_cast<std::chrono::seconds>(d);
tv.tv_sec = sec.count();
tv.tv_usec = std::chrono::duration_cast<std::chrono::microseconds>(d - sec).count();
}
UPDATE:
单独的方法,例如to_timeval()
都不太方便。超载电源在哪里?我们刚刚硬编码了类型timeval
进入函数名称to_timeval()
。这不是 C++ 的方式。我想通过struct timeval
例如,std::chrono::duration_cast()
并得到我的chrono
-结果,反之亦然。
所以,我们可以扩展std::chrono::duration_cast
(当然,风险由您自己承担)。享受。
namespace std {
namespace chrono {
namespace detail {
template<typename From, typename To>
struct posix_duration_cast;
// chrono -> timeval caster
template<typename Rep, typename Period>
struct posix_duration_cast< std::chrono::duration<Rep, Period>, struct timeval > {
static struct timeval cast(std::chrono::duration<Rep, Period> const& d) {
struct timeval tv;
std::chrono::seconds const sec = std::chrono::duration_cast<std::chrono::seconds>(d);
tv.tv_sec = sec.count();
tv.tv_usec = std::chrono::duration_cast<std::chrono::microseconds>(d - sec).count();
return std::move(tv);
}
};
// timeval -> chrono caster
template<typename Rep, typename Period>
struct posix_duration_cast< struct timeval, std::chrono::duration<Rep, Period> > {
static std::chrono::duration<Rep, Period> cast(struct timeval const & tv) {
return std::chrono::duration_cast< std::chrono::duration<Rep, Period> >(
std::chrono::seconds(tv.tv_sec) + std::chrono::microseconds(tv.tv_usec)
);
}
};
}
// chrono -> timeval
template<typename T, typename Rep, typename Period>
auto duration_cast(std::chrono::duration<Rep, Period> const& d)
-> std::enable_if_t< std::is_same<T, struct timeval>::value, struct timeval >
{
return detail::posix_duration_cast< std::chrono::duration<Rep, Period>, timeval >::cast(d);
}
// timeval -> chrono
template<typename Duration>
Duration duration_cast(struct timeval const& tv) {
return detail::posix_duration_cast< struct timeval, Duration >::cast(tv);
}
} // chrono
} // std
这只是一个例子。作为替代方案,我们可以实现自己的duration_cast()
在某些情况下将其转发到std::chrono::duration_cast()
.
我们还记得struct timespec
.