除了很少的例外(看你,华氏温度和摄氏温度),单位是线性的,零值同时是所有单位的加性标识.
所以给
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; } };
不幸的是,部署的维度/单位库似乎没有这样做. (这个问题出现了,因为我实际上想测试一个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类型.)
>你已经指出了一个失败点,对于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; } };