从双倍转换为时间

时间:2017-07-17 19:11:18

标签: c++ chrono

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

我想使用此比率来安排类型为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

1 个答案:

答案 0 :(得分:3)

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

duration<double>将您的双倍转换为seconds存储为双精度数。接下来,您将seconds投射到nanoseconds

在C ++ 17中,如果你愿意,你可以用另一种舍入模式替换duration_cast

  • duration_cast:截断为零。
  • floor:截断为负无穷大。
  • ceil:截断正无穷大。
  • round:向最接近的积分舍入,甚至在领带上。

如果它对您的应用程序很重要,并且您不能等到C ++ 17,那么它们的开源实现就会浮动并且很容易找到。

通常,有两种情况需要使用duration_cast或其他一些明确的舍入模式:

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

  2. 当您从基于浮点的持续时间分配或复制到基于积分的持续时间时。

  3. 上述两种转换都涉及截断错误。因此<chrono>要求您使用duration_cast明确承认您要截断。

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

    meanWaitingseconds而不是nanoseconds的修改后的答案中,duration_cast仍然是必需的,因为您将截断基于双精度的小数部分{ {1}}:

    duration

    有关meanWaiting = duration_cast<seconds>( duration<double>{(maxWait * (maxDistance - distance) / maxDistance)}); 的完整视频教程,请参阅我的Cppcon 2016讲座:https://www.youtube.com/watch?v=P32hvk8b13M