【问题标题】:Millimeters in boost::units升压中的毫米::单位
【发布时间】:2013-01-21 08:32:09
【问题描述】:

我想将 boost::units 用于某些 SI 指标。然而,我们的代码主要处理毫米而不是使用

quantity<length> value = 1*milli*meter;

我们更喜欢类似的东西

quantity<length> value = 1*millimeter;

但是我不确定如何定义“毫米”(不使用#define)。

其次,使用前缀单位的开销是多少?

更新:这需要在没有 C++11 特性的情况下运行(即没有 UDL)

【问题讨论】:

    标签: c++ boost boost-units


    【解决方案1】:

    C++11 确实是最简单的解决方案。你可以这样做

    static const auto millimeter = milli * meter;
    

    auto operator"" _mm (long double val) -> decltype(val * milli * meter)
    {
         return val * milli * meter;
    }
    

    只要不转换为其他前缀,就不会有性能损失。即使你这样做了,也应该可以忽略不计。

    如果您不想使用 C++11,则需要找出表达式 milli * meter 的对应类型,尽管您可以将 auto 替换为 int 并阅读编译器消息。

    【讨论】:

    【解决方案2】:

    我正在使用以下方法:

    // your namespace name for units
    namespace outernamespace {
        namespace millimeter_system {
            typedef boost::units::scaled_base_unit<boost::units::si::meter_base_unit, boost::units::scale<10, boost::units::static_rational<-3>>> millimeter_base_unit;
    
            typedef boost::units::make_system<millimeter_base_unit>::type system;
            typedef boost::units::unit<boost::units::length_dimension, system> length;
    
            BOOST_UNITS_STATIC_CONSTANT(millimeter, length);
            BOOST_UNITS_STATIC_CONSTANT(millimeters, length);
        }
    
        typedef boost::units::quantity<millimeter_system::length> quantity_millimeter;
        using millimeter_system::millimeter;
        using millimeter_system::millimeters;
    }
    
    // demonstration of usage
    void foo() {
        using namespace outernamespace;
        using namespace boost::units;
        using namespace boost::units::si;
    
        quantity_millimeter mm = 5 * millimeter;
        quantity<boost::units::si::length> m = 0.004 * meter;
        if (mm < static_cast<quantity_millimeter>(m)) {
            std::cout << 'lt ' << std::endl;
        }
        else {
            std::cout << 'geq ' << std::endl;
        }
    }
    

    【讨论】:

      【解决方案3】:

      如果你有一个支持 C++11 的编译器,你可以使用 User Defined Literals 来定义你的单位。

      double operator"" _millimeter ( double value )
      {
          return value;
      }
      

      你可以这样使用:

      double foo = 1000_millimeter;
      

      【讨论】:

      • 但这不是“真正的”毫米,而只是附加了一个后缀。 IE。 boost::units 的所有功能都消失了。例如。米/毫米之间的转换,知道面积 s = 1*毫米 * 1*毫米是正确的,但面积 s = 1 * 5 不是。
      • 另外我需要一些不使用 UDL 的东西。
      • 但这可以通过返回数量 而不是 double 轻松地与提升单位组合
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-10-12
      • 2011-01-01
      • 1970-01-01
      • 2021-07-04
      • 2018-05-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多