Я хочу использовать boost :: unit для некоторых показателей SI. Однако наш код в основном имеет дело с миллиметрами и вместо использования
quantity<length> value = 1*milli*meter;
мы бы предпочли что-то вроде
quantity<length> value = 1*millimeter;
Однако я не уверен, как определить «миллиметр» (без использования #define).
Во-вторых, каковы издержки при использовании префиксных модулей?
Обновление: это должно работать без функций C ++ 11 (т.е. без UDL)
Я использую следующий подход:
// 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
от int
и прочитайте сообщение компилятора.
Если у вас есть компилятор с поддержкой C ++ 11, вы можете использовать Пользовательские литералы для определения ваших подразделений.
double operator"" _millimeter ( double value )
{
return value;
}
Вы можете использовать это так:
double foo = 1000_millimeter;