C++可以为单位提供“字面后缀代码”。

6
C++1x支持字面量后缀(例如,参见http://ecn.channel9.msdn.com/events/GoingNative12/GN12Cpp11Style.pdf)。我正在使用gcc 4.7并希望为我们的系统引入一些单位。最值得注意的是,我们的一半代码使用度数,另一半则使用弧度(由于各种第三方库),这显然总是一个常见的错误原因。能够说例如“Radian angle = 90_deg;”将非常有帮助。
我已经研究了如何实现这一点,看起来是可行的,但需要一些时间来做好每一件事。所以我想知道是否有已经实现了所有这些的测试好的成品可以使用(没有必要让每个C ++开发人员都重新实现这个,难道不是吗?)。除了rad/deg之外,我在寻找长度测量(毫米、厘米、米)。我已经尝试了谷歌搜索,但没有找到任何可用的内容。
有人知道例如SI系统的实现可以使用吗?

1
这个参考文献(http://en.cppreference.com/w/cpp/language/user_literal)有一些例子。 - Some programmer dude
谢谢,但我不需要示例/参考。我相信我可以实现一个完整的文字和转换操作符集来处理我的需求。然而,这需要时间来实现,并且需要测试所有用例。由于SI系统对每个人都是相同的,我认为数百名C++开发人员会做类似的事情 - 所以我希望有人已经完成了一个干净且经过测试的实现,可以“只是”使用。我不想重复造轮子。 - Frankie
3
不想重新发明轮子,这是你不需要的内容,但Boost在Boost.Units下提供了一个模板化版本。我很好奇你会得到什么其他答案。 - Ali
@llonesmiz:我也发现了,但它不完整。至少缺少强制类型转换运算符。 - Frankie
显示剩余2条评论
1个回答

2

使用boost.units

您将获得预期的好处:能够安全地处理用不同单位表示的度量。
使用boost units的语法并不难:

quantity<length>    dx(2.0*meter);

@bames53 我不是想这么说。只是 boost.Units 没有提供 UDL。 - log0
你提到我可以获得相同的好处。但是假设我找到了一个C++11x实现,为什么Boost更可取呢? - Frankie
@Frankie,非常抱歉,我的回答似乎並不清楚。Boost 將提供您所需的內容:一個在 SI 系統中輕鬆/安全地操作單元的庫。然而,Boost 库不提供 UDL(這只是语法糖)。為什麼應該使用 Boost?因為 Boost 傾向於成為 C++ 標准庫的孵化器。其質量標準非常高,庫經過測試,並擁有重要的用戶社區。 - log0
1
我已经实现了一个简单的用户定义字面量,用于boost单位,包括所有S.I.前缀在这里 - user3317
此外还有PhysUnits-CT-Cpp11,它是一个小型的C++11、C++14头文件库,用于编译时维度分析和单位/数量操作和转换。比Boost.Units更简单,仅依赖于标准C++库,仅支持国际单位制(SI),以及维度的整数幂次。 - Martin Moene

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接