gpt4 book ai didi

c++ - double 到 time 的转换

转载 作者:行者123 更新时间:2023-11-30 02:24:44 27 4
gpt4 key购买 nike

我正在开发的应用程序使用 double 类型进行距离计算。因此,最后我有一个变量类型 double(比如 deferTime = 0.024 秒),这是一个基于两个节点之间距离的比率。

我想使用这个比率来安排一个类型为 time::seconds 的事件。 API 定义下方:

scheduleEvent (const time::nanoseconds & after, const EventCallback & callback)

在我的库文件中,我将 deferTime 声明如下:

time::seconds meanWaiting;

在我的 .cpp 文件中,我将比率分配给 deferTime:(** 使用秒而不是纳秒更新 **)

meanWaiting = std::chrono::duration<double>{(maxWait * 
(maxDistance - distance) / maxDistance)};

但我收到以下错误:

error: no match for ‘operator=’ (operand types are ‘boost::chrono::seconds {aka boost::chrono::duration<long int>}’ and ‘std::chrono::duration<double>’)
meanWaiting = std::chrono::duration<double>{(maxWait * (maxDistance - distance) / maxDistance)};
^
In file included from /usr/include/boost/chrono/chrono.hpp:11:0,
from /usr/include/boost/chrono/include.hpp:15,
from /usr/include/boost/chrono.hpp:17,
from /usr/local/include/ndn-cxx/util/time.hpp:26,
from /usr/local/include/ndn-cxx/name-component.hpp:28,
from /usr/local/include/ndn-cxx/name.hpp:30,
from /usr/local/include/ndn-cxx/interest.hpp:25,
from ./../core/common.hpp:57,
from <command-line>:0:
/usr/include/boost/chrono/duration.hpp:465:19: note: candidate: boost::chrono::duration<Rep, Period>& boost::chrono::duration<Rep, Period>::operator=(const boost::chrono::duration<Rep, Period>&) [with Rep = long int; Period = boost::ratio<1l>]
duration& operator=(const duration& rhs) = default;
^
/usr/include/boost/chrono/duration.hpp:465:19: note: no known conversion for argument 1 from ‘std::chrono::duration<double>’ to ‘const boost::chrono::duration<long int>&’

可以找到 ndn-cxx 库 here .

最佳答案

using namespace std::chrono;
meanWaiting = duration_cast<nanoseconds>(
duration<double>{(maxWait * (maxDistance - distance) / maxDistance)});

duration<double>将你的替身变成 seconds存储为 double 。接下来你投那些 secondsnanoseconds .

在 C++17 中,您将能够替换 duration_cast如果需要,可以使用另一种舍入模式:

  • duration_cast : 截断为零。
  • floor : 向负无穷大截断。
  • ceil : 向正无穷大截断。
  • round : 舍入到最接近的积分,以达到平局。

如果它对您的应用程序很重要,并且您不能等到 C++17,那么这些的开源实现随处可见并且很容易找到。

一般有两种情况需要用到duration_cast ,或其他一些显式舍入模式:

  1. 当您从精细持续时间分配或复制到粗略持续时间(例如 nanosecondsseconds ),以及

  2. 当您从基于 float 的持续时间分配或复制到基于整数的持续时间时。

以上两种转换都涉及截断错误。所以<chrono>要求您使用 duration_cast 明确确认您想要截断.

对于不涉及截断错误的转换(例如,整数秒到整数纳秒,或整数持续时间到任何浮点持续时间),您可以使用隐式转换语法。

在修改后的答案中 meanWaitingseconds而不是 nanoseconds , duration_cast仍然是必需的,因为您将截断基于 double 的 duration 的小数部分:

meanWaiting = duration_cast<seconds>(
duration<double>{(maxWait * (maxDistance - distance) / maxDistance)});

有关 <chrono> 的完整视频教程请看我的 Cppcon 2016 演讲:https://www.youtube.com/watch?v=P32hvk8b13M

关于c++ - double 到 time 的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45151926/

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