簡體   English   中英

升力::單位毫米

[英]Millimeters in boost::units

我想對一些SI指標使用boost :: units。 然而,我們的代碼主要處理毫米而不是使用

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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM