我正在从事一个软件设计,在这个软件设计中,我想利用Boost.Units。我想使用的一些单位代表时间,然而,我倾向于使用C++11 std::chrono单位,因为它们是标准的。
我想知道Boost.Units和chrono之间是否有任何干净的集成,或者我是否必须求助于编写自己的转换器,并通过在类型之间复制标量值来失去类型安全性。
对于这个问题,有没有什么最佳实践?
发布于 2018-03-15 21:27:43
如果您只想将std::chrono时长转换为boost时间量,您可以使用以下模板函数:
using time_quantity = boost::units::quantity<si::time, double>;
template<class _Period1, class _Type>
time_quantity toBoostTime( chrono::duration<_Type, _Period1> in)
{
return time_quantity::from_value(double(in.count()) * double(_Period1::num) / double(_Period1::den) );
}需要注意的一点是,返回的time_quantity将始终以秒为单位,并且存储类型为double类型。如果这两个中的任何一个是问题,模板都可以调整。
示例:
namespace bu = boost::units;
namespace sc = std::chrono;
using time_quantity_ms = bu::quantity<decltype(bu::si::milli * bu::si::second), int32_t>;
std::cout << "Test 1: " << toBoostTime(sc::seconds(10)) << std::endl;
std::cout << "Test 2: " << toBoostTime(sc::milliseconds(10)) << std::endl;
std::cout << "Test 3: " << static_cast<time_quantity_ms>(toBoostTime(sc::milliseconds(10))) << std::endl;
/* OUTPUT */
Test 1: 10 s
Test 2: 0.01 s
Test 3: 10 ms发布于 2016-05-24 10:12:27
这可能不是一个完美的答案,但boost::chrono提供了一个如何将其与他们在example itself (devel) (version at time of writing)中定义的单位系统集成的示例。
本质上,基于boost.units examples for quaternion and complex numbers,应该可以为std::chrono单元定义相同的函数,尽管它可能需要为新的用户定义单元添加额外的代码。
还有一个类似的question regarding boost::date_time,虽然略有不同,但也可能包含有用的信息。
很抱歉,这不是一个完整的答案,但也许这将是一个其他人可以完成的开始!
https://stackoverflow.com/questions/19412678
复制相似问题