Millimeters in boost::units

后端 未结 3 1493
鱼传尺愫
鱼传尺愫 2021-01-05 09:55

I want to use boost::units for some SI metrics. However our code mostly deals with millimeters and instead of using

quantity value = 1*milli*m         


        
相关标签:
3条回答
  • 2021-01-05 10:42

    C++11 is indeed the easiest solution. You could do

    static const auto millimeter = milli * meter;
    

    or

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

    There should be no performance penalty as long as you are not converting to other prefixes. And even if you do it should be neglible.

    If you don't want to use C++11 you'd need to find out the corresponding type of the expression milli * meter, though you could just replace auto by int and read the compiler message.

    0 讨论(0)
  • 2021-01-05 10:47

    If you have a C++11 capable compiler you could use User Defined Literals for defining your units.

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

    You can use that like so:

    double foo = 1000_millimeter;
    
    0 讨论(0)
  • 2021-01-05 10:50

    I am using the following approach:

    // 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;
        }
    }
    
    0 讨论(0)
提交回复
热议问题