现在我们很快就可以使用用户定义字面量(UDL)了,例如在GCC 4.7中。我非常期待物理单位库(例如Boost.Units)使用它们来简化文字表达式,如1+3i
、3m
、3meter
或13_meter
。是否有人编写了扩展 Boost.Units,以支持使用UDL的这种行为?
现在我们很快就可以使用用户定义字面量(UDL)了,例如在GCC 4.7中。我非常期待物理单位库(例如Boost.Units)使用它们来简化文字表达式,如1+3i
、3m
、3meter
或13_meter
。是否有人编写了扩展 Boost.Units,以支持使用UDL的这种行为?
目前还没有人开发出这样的扩展。只有gcc(可能还有IBM?)拥有UDL,所以可能需要一段时间。我希望某种单位能够进入现在开始的tr2,如果发生这种情况,我相信将会提出用于单位的UDL。
这个有效:
// ./bin/bin/g++ -std=c++0x -o units4 units4.cpp
#include <boost/units/unit.hpp>
#include <boost/units/quantity.hpp>
#include <boost/units/systems/si.hpp>
using namespace boost::units;
using namespace boost::units::si;
quantity<length, long double>
operator"" _m(long double x)
{ return x * meters; }
quantity<si::time, long double>
operator"" _s(long double x)
{ return x * seconds; }
int
main()
{
auto l = 66.6_m;
auto v = 2.5_m / 6.6_s;
std::cout << "l = " << l << std::endl;
std::cout << "v = " << v << std::endl;
}
我认为浏览您最喜欢的单元并执行此操作不会太困难。
关于将这些放入库中: 字面运算符是命名空间范围函数。后缀的竞争会变得混乱不堪。如果我是Boost,我会这样做。
namespace literals
{
...
}
using boost::units::literals;
std :: tr2 :: units
这样的东西覆盖。 同样,如果您自己编写代码也是如此。在我看来,使用Boost.Units的字面量并没有太大的好处,因为通过现有的能力仍然可以实现更强大的语法。
在简单的情况下,似乎使用字面量是正确的选择,但很快你会发现它并不是非常强大。 例如,你仍然需要为组合单位定义字面量,比如怎样表示1 m/s(每秒一米)?
当前:
auto v = 1*si::meter/si::second; // yes, it is long
// fake code
using namespace boost::units::literals;
auto v = 1._m_over_s; // or 1._m/si::second; or 1._m/1_s // even worst
现有功能可以实现更好的解决方案。这就是我所做的:
namespace boost{namespace units{namespace si{ //excuse me!
namespace abbreviations{
static const length m = si::meter;
static const time s = si::second;
// ...
}
}}} // thank you!
using namespace si::abbreviations;
auto v = 1.*m/s;
auto a = 1. * m / pow<2>(s);
或者如果您想要更多的缩写(例如static const area m2 = pow<2>(si::meter);
),则可以扩展缩写。
除此之外,您还需要什么?
也许一个综合解决方案可能是正确的方式。
auto v = 1._m/s; // _m is literal, /s is from si::abbreviation combined with operator/
*
替换为_
)。1.*m_/s_
,我没有别的方法,但至少我可以构建真实的单位表达式。
l
、f
和d
冲突。下划线的要求回答了这个问题。 - Nordlöw