我正在开发的应用程序使用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。
答案 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
或其他一些明确的舍入模式:
当您将精细持续时间分配或复制到粗略持续时间(例如nanoseconds
至seconds
)时,
当您从基于浮点的持续时间分配或复制到基于积分的持续时间时。
上述两种转换都涉及截断错误。因此<chrono>
要求您使用duration_cast
明确承认您要截断。
对于不涉及截断错误的转换(例如积分纳秒的整数秒,或任何浮点持续时间的积分持续时间),您可以使用隐式转换语法。
在meanWaiting
为seconds
而不是nanoseconds
的修改后的答案中,duration_cast
仍然是必需的,因为您将截断基于双精度的小数部分{ {1}}:
duration
有关meanWaiting = duration_cast<seconds>(
duration<double>{(maxWait * (maxDistance - distance) / maxDistance)});
的完整视频教程,请参阅我的Cppcon 2016讲座:https://www.youtube.com/watch?v=P32hvk8b13M