7

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)

4

3 に答える 3

13

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ことができます。autoint

于 2013-02-06T08:05:02.180 に答える
6

私は次のアプローチを使用しています:

// 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;
    }
}
于 2013-02-18T18:53:51.743 に答える
-2

C++11 対応のコンパイラがある場合は、ユーザー定義リテラルを使用してユニットを定義できます。

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

次のように使用できます。

double foo = 1000_millimeter;
于 2013-02-06T07:58:52.887 に答える