毫米助推::单位

Millimeters in boost::units

本文关键字:单位      更新时间:2023-10-16

我想对一些SI度量使用boost::单位。然而,我们的代码主要处理毫米,而不是使用

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

我们更喜欢

quantity<length> value = 1*millimeter;

然而,我不知道如何定义"毫米"(不使用#define)。

第二,使用前缀单位的开销是多少?

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

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的相应类型,尽管您可以用int替换auto并读取编译器消息。

我使用以下方法:

// 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的编译器,你可以使用用户定义的文字来定义你的单元。

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

你可以这样使用:

double foo = 1000_millimeter;