我想使用boost ::单位的一些SI指标。 但是我们的代码大多是涉及毫米和,而不是使用
quantity<length> value = 1*milli*meter;
我们宁愿像
quantity<length> value = 1*millimeter;
但是我不知道如何界定“毫米”(不使用#定义)。
其次,什么是使用前缀单位的开销?
更新:这需要没有C ++ 11个功能运行(即没有UDL)
我想使用boost ::单位的一些SI指标。 但是我们的代码大多是涉及毫米和,而不是使用
quantity<length> value = 1*milli*meter;
我们宁愿像
quantity<length> value = 1*millimeter;
但是我不知道如何界定“毫米”(不使用#定义)。
其次,什么是使用前缀单位的开销?
更新:这需要没有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;