c++boostboost-units

Millimeters in boost::units


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

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

we would prefer something like

quantity<length> value = 1*millimeter;

However I am not sure how to define "millimeter" (without using #define).

Secondly, what is the overhead in using prefixed units?

Update: This needs to run without C++11 features (i.e. no UDL)


Solution

  • 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;
        }
    }