我正在开发一个我想利用的软件设计Boost.Units
。我想使用的一些单位代表时间,但是,我倾向于使用 C++11std::chrono
单位,因为它们是标准的。
我想知道之间是否有任何干净的集成Boost.Units
,chrono
或者我是否必须求助于编写自己的转换器并通过仅在类型之间复制标量值来失去类型安全性。
这个问题有什么最佳实践吗?
我正在开发一个我想利用的软件设计Boost.Units
。我想使用的一些单位代表时间,但是,我倾向于使用 C++11std::chrono
单位,因为它们是标准的。
我想知道之间是否有任何干净的集成Boost.Units
,chrono
或者我是否必须求助于编写自己的转换器并通过仅在类型之间复制标量值来失去类型安全性。
这个问题有什么最佳实践吗?
如果您只想将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
这可能不是一个完美的答案,但 boost::chrono 提供了一个示例,说明如何将其与他们在示例本身 (devel) (编写时的版本) 中定义的单位系统集成。
本质上,基于四元数和复数的 boost.units 示例,应该可以为 std::chrono 单元定义相同的函数,尽管它可能需要为新的用户定义单元添加额外的代码。
关于 boost::date_time还有一个类似但略有不同的问题,它也可能有有用的信息。
抱歉,这不是一个完整的答案,但也许这将是其他人可以完成的开始!