ごくわずかな例外を除いて (華氏と摂氏の温度スケールを見てください)、単位は線形であり、値ゼロは同時にすべての単位の加算単位です。
与えられた
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 AU/fortnight またはその他の使用したい単位 (速度用) のためです。問題は、これを有効にする方法と、この使用法のみです。
C++11 の明示的な演算子とコンテキスト変換bool
により、"safe-bool" イディオムが不要になりました。この問題は、同等の「セーフゼロ」イディオムで解決できるようです。
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::duration
(この質問は、aが負かどうかを実際にテストしたかったために発生しました)。これは役に立ちますか?失敗するケースはありますか?ゼロとの比較を許可する簡単な方法はありますか?
個々の演算子に対してこれを実装する代わりに、リテラルゼロからユニットタグ付き型への暗黙的な変換が存在するはずであると思われます。
私はそれが許可することに注意します
X{1} < nullptr
有効な式として:(、残念ながら、アクセスできないタイプのオーバーロードを提供しても、std::nullptr_t
これは修正されません。これは、標準がセクション4.10で述べているためです
整数型の null ポインター定数は、型の prvalue に変換できます
std::nullptr_t
。