【问题标题】:Is there a reason not to use unit enforcing types?是否有理由不使用单元强制类型?
【发布时间】:2012-09-17 05:13:21
【问题描述】:

在我看来,在我看来,使用基于单位强制执行的类型 (Meters, Seconds, Kilograms) 会带来巨大的好处(额外检查传递的参数,摆脱 vars 中的单位名称,等),但我还没有遇到那么多代码。而且我看到的代码确实使用了自定义类型。

我看到 boost 有一个单位库 (boost::units 足够简单),但是,我没有看到太多证据表明它被广泛使用 (在基本的谷歌搜索中).

这样做有充分的理由吗?

这些似乎意味着一定有某种原因这种做法没有像我预期的那样被广泛采用。出于某种原因,也许比他们值得的麻烦更多?

所以我问:

是否有理由不使用单元强制类型?特别是有理由不使用 boost::units 吗?

【问题讨论】:

    标签: c++ boost types units-of-measurement boost-units


    【解决方案1】:

    我认为这种技术不流行的主要原因是拼写和阅读非常困难和麻烦。

    希望这最终会成为 C++11 更被接受的编程风格,它将用户定义的文字添加到让你编写的语言中:

    auto acc = 10_m / 1_s / 1_s;
    

    而不是传统的

    myframework::units::si<acceleration>::type acc = myframework::unit_cast<units::meters>(10.0)
       / myframework::unit_cast<units::seconds>(1)
       / myframework::unit_cast<units::seconds>(1);
    

    【讨论】:

    • 哦,非常好。我不知道 C++11 中的那个特性。
    • 不能用几个 typedef 解决很多问题吗?
    • @Catskul:你无法真正避免一定程度的冗长。看看 Boost.Units,看看“专业设计”的解决方案有多好。我会说这仍然比大多数程序员愿意忍受的要嘈杂得多。
    • 您的“传统示例”可以通过使用 typedef 并且不尝试在一个语句中完成所有操作(使用变量来保存贡献值)来相当容易地简化。诚然,总是有一定程度的冗长,但你夸大了它的难度。
    【解决方案2】:

    我已经使用这个库来编写正确的代码了。不幸的是,它的使用难度是应有的 10 倍。虽然跟踪尺寸和单位是一场噩梦,但仍然值得。

    boost 单位库非常聪明、强大且完整。问题是,文档几乎不可读。名称混淆有很多问题,没有类型要求。作者提供了许多有用的示例,但不能替代构建更好的文档。

    仅供参考 - 我在 CPPcon 2015 上介绍了一个关于这个主题的教程。你可以在 https://www.youtube.com/watch?v=qphj8ZuZlPA 找到它

    【讨论】:

      猜你喜欢
      • 2010-11-03
      • 2013-06-08
      • 2020-10-05
      • 1970-01-01
      • 2020-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-14
      相关资源
      最近更新 更多