加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 05:26:40 所属栏目:百科 来源:网络整理
导读:除了很少的例外(看你,华氏温度和摄氏温度),单位是线性的,零值同时是所有单位的加性标识. 所以给 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; }
};

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读