所以给
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 – 使用单位安全代码处理文字零所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)