c – 使用单位安全代码处理文字零

c – 使用单位安全代码处理文字零,第1张

概述除了很少的例外(看你,华氏温度和摄氏温度),单位是线性的,零值同时是所有单位的加性标识. 所以给 auto speed = dimensioned(20, _meter/_second);auto power = dimensioned(75, _watt); 然后 if (speed < 6) ...if (power > 17) ... 没有意义 if (speed > power) .. 除了很少的例外(看你,华氏温度和摄氏温度),单位是线性的,零值同时是所有单位的加性标识.

所以给

auto speed = dimensioned(20,_meter/_second);auto power = dimensioned(75,_watt);

然后

if (speed < 6) ...if (power > 17) ...

没有意义

if (speed > power) ...

你应该写

if (speed < dimensioned(6,_mile/_hour)) ...

但是,这是有道理的:

if (speed < 0)

因为0 m / s == 0 mph == 0 A.U./fortnight或您要使用的任何其他单位(速度).那么问题是如何启用这个,只有这个用法.

C 11明确的运算符和上下文转换为布尔,摆脱了“安全布尔”成语的需要.看来这个问题可以用可比较的“安全零”成语来解决:

struct X{  int a;  frIEnd bool operator<(const X& left,const X& right) { return left.a < right.a; }private:  struct safe_zero_idiom;public:  frIEnd bool operator<(const X& left,safe_zero_idiom*) { return left.a < 0; }};

>演示:http://ideone.com/vUxmxi

不幸的是,部署的维度/单位库似乎没有这样做. (这个问题出现了,因为我实际上想测试一个std :: chrono ::持续时间是否为负).这是有用的吗?有情况会导致失败吗?有没有比较容易的方法可以比较零?

一个人怀疑,不是为个体运算符实现这一点,所以应该存在从字面零到单元标签类型的隐式转换.

我注意到它允许

X{1} < nullptr

作为一个有效的表达式:(不幸的是,提供了一个无法访问的类型std :: nullptr_t的重载不能解决这个问题,因为标准在第4.10节中说

A null pointer constant of integral type can be converted to a prvalue of type std::nullptr_t.

解决方法 >是的.你很容易相信这是有用的.
>你已经指出了一个失败点,对于nullptr.我不能想到除此以外的任何东西.
我试图设计一个机制来禁止nullptr但允许0都产生了不起作用的复杂方案.基本上,由于没有办法告诉C你想要一个constexpr函数参数,它很难(我不会说不可能…)设计一个接受int参数的函数,但是如果参数值不为0.
>如果你可以允许nullptr,那么一个更简单的实现就是直接使用std :: nullptr_t,而不是单独的safe_zero_idiom类. (诚​​然,它不是安全的,因为在实现中没有办法访问safe_zero_idiom类型.)
struct X{  int a;  frIEnd bool operator<(const X& left,const X& right) { return left.a < right.a; }  frIEnd bool operator<(const X& left,std::nullptr_t) { return left.a < 0; }};
总结

以上是内存溢出为你收集整理的c – 使用单位安全代码处理文字零全部内容,希望文章能够帮你解决c – 使用单位安全代码处理文字零所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1247158.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存