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

除了很少的例外(看你,华氏温度和摄氏温度),单位是线性的,零值同时是所有单位的加性标识.

所以给

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&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...