我正在开发一个软件设计,我想利用Boost.Units
。我想使用的一些单元代表时间,但是,我倾向于使用C ++ 11 std::chrono
单元,因为它们是标准的。
我想知道Boost.Units
和chrono
之间是否存在任何干净的集成,或者我是否必须通过在类型之间复制标量值来编写自己的转换器并失去类型安全性。
此问题是否有最佳做法?
答案 0 :(得分:1)
如果您只想将std::chrono
持续时间转换为提升时间数量,可以使用以下模板功能:
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
答案 1 :(得分:0)
这可能不是一个完美的答案,但是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也可能有有用的信息。
对不起,这不是一个完整的答案,但也许这将是一个别人可以完成的开始!