ハンドルの周囲にラッパーがあります(int
と表示されます)。しかし、私はまた、if
条件でこれを簡単にチェックしたいと思います。 -1 or <0
は無効な値です。私のアイデア:私は簡単に機能int
を取り、すべてのチェックが合格にFoo
を渡すことができユーザー定義のブール変換の優先順位
#include <cassert>
struct Foo{
int i;
Foo(int i): i(i){}
operator int() const { return i; }
operator bool() const { return i >= 0; }
};
int main(){
Foo a(0);
if(a)
;
else
assert(false);
if(!a)
assert(false);
assert(!!a);
Foo b(1);
assert(!!b);
assert(b);
assert(a != b);
Foo c(-1);
Foo d(-1);
assert(!c);
assert(c==d);
Foo e(-2);
assert(c!=e);
}
この方法です。しかし、私はint変換のブール変換よりも優先順位が心配です。何かありますか? if(Foo(...))
/if(!Foo(...))
/if(!!Foo(...))
は常にブール変換を行いますが、直接比較ではint変換が行われるので、Foo(1) != Foo(0)
とFoo(1) != Foo(2)
は常に指定できますか?
標準(C++ 98)は、bool/intのユーザー定義の変換には順序を入れていないようです。
C++ 98を使用する必要がありますか? C++ 11以降では、 '明示的な変換'演算子 'を提供しています。これは、' bool'への正しい変換が主な根拠の1つであったことを保証します。意思決定に使用すると非常に間違った結果を生む可能性があります。古いC++を使用する必要がある場合は、「安全なブール」イディオムを調べてください。 –
はい、C++ 98を使用する必要があります。私は比較のために選ばれるかもしれないint-conversionをまだ持っているので、安全なブールのイディオムがここで助けてくれるとは思わない。 – Flamefire