【问题标题】:std::chrono & Boost.Unitsstd::chrono & Boost.Units
【发布时间】:2013-10-25 02:44:26
【问题描述】:

我正在开发一个软件设计,我想在其中利用 Boost.Units。我想使用的一些单位代表时间,但是,我倾向于使用 C++11 std::chrono 单位,因为它们是标准的。

我想知道Boost.Unitschrono 之间是否有任何干净的集成,或者我是否必须求助于编写自己的转换器并通过在类型之间复制标量值而失去类型安全性。

有没有针对这个问题的最佳实践?

【问题讨论】:

  • 我最近开始使用boost::units。 AFAICT 与时间或boost::chrono 无关。我认为boost::unitsboost::chrono 背后的概念差别太大了。但是,您可以查看基于(.. 或重新实现)std::chronoboost::date_time。在那里,您会发现大量涉及时间方面任何方面的课程。
  • 也许将标量包装在一个新类中,从而在提供getAs[Type] 函数的同时隐藏标量?单点失败总比多点好。
  • 对于那些来到这里的人,以下问题是相关的,但略有不同:stackoverflow.com/questions/4910373/…

标签: c++ boost c++11 chrono boost-units


【解决方案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 总是以秒为单位,存储类型将是双精度型。如果这两个中的任何一个有问题,则可以调整模板。

例子:

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

【讨论】:

    【解决方案2】:

    这可能不是一个完美的答案,但 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,它可能也有有用的信息。

    对不起,这不是一个完整的答案,但也许这将是其他人可以完成的开始!

    【讨论】:

      猜你喜欢
      • 2017-09-02
      • 2014-03-23
      • 1970-01-01
      • 2020-10-13
      • 1970-01-01
      • 1970-01-01
      • 2011-12-14
      • 1970-01-01
      • 2018-02-03
      相关资源
      最近更新 更多