gpt4 book ai didi

c++ - 如何将 std::chrono::system_clock::duration 转换为 struct timeval

转载 作者:行者123 更新时间:2023-12-02 01:34:09 26 4
gpt4 key购买 nike

标题说明了一切。

我必须实现一个接收 std::chrono::system_clock::duration 值的函数,并且需要将其转换为 timeval 结构,以便我可以将其传递给某些系统函数。

最佳答案

更通用的实现。

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();
}

更新:

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

关于c++ - 如何将 std::chrono::system_clock::duration 转换为 struct timeval,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17402657/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com