Миллиметры в boost:: единицы измерения

Я хочу использовать boost:: units для некоторых метрик SI. Однако наш код в основном имеет дело с миллиметрами и вместо использования

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

мы предпочли бы что-то вроде

quantity<length> value = 1*millimeter;

однако я не уверен, как определить "миллиметр" (без использования #define).

во-вторых, каковы накладные расходы при использовании префиксных единиц?

Update: это должно выполняться без функций C++11 (т. е. без UDL)

3 ответов


Я использую следующий подход:

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

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 by int и прочитайте сообщение компилятора.


Если у вас есть компилятор с поддержкой C++11, вы можете использовать Пользовательские Литералы для определения ваших юнитов.

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

Вы можете использовать это так:

double foo = 1000_millimeter;