-3

私はc++で構造体をブール値として評価することに固執しています

struct foo {
  int bar;
};
foo* x = (foo*)malloc(sizeof(foo));
int y = ( x ) ? 3 : 4;

これは、実行されたときに発生することです。

could not convert 'x' from 'foo' to 'bool'

ブール演算子を検索するとき、コンパレータのブール演算子をオーバーロードする方法しか見つかりません。ブール演算子としてのストレートアップ評価構造体はありますか?

また、可能であればfooを単純な古いデータとして保持したいと思います。

4

2 に答える 2

6

まっすぐな evaluate-struct-as-a-bool 演算子はありません。そのため、構造体にメソッドを与えるoperator bool方法があります。コンテキストで使用されたときに、指定された構造体型の値を解釈する方法をコンパイラに指示しboolます。

ただし、演​​算子は構造体へのポインターではなくstructsに適用されるため、あなたが示したコードはそのような演算子を使用しません。ではなく、タイプの式があります。ポインターは、コンパイラーが実行方法を知っている組み込みの変換であるため、自動的に変換されます。null ポインターは false であり、null 以外のポインターは true です。質問に示されているコードは、報告されたエラー メッセージを生成しません。foo*foobool

コンパイラが期待する場所に実際に構造体がありbool、何らかの理由で構造体にoperator boolメソッドを与えることができない場合は、昔ながらの方法で変換を実行し、通常の関数を使用できます。

bool interpret_foo_as_bool(foo const& f);

必要に応じて関数を実装し、それを呼び出して値を渡しますfoo。例えば:

foo* x = ...;
int y = interpret_foo_as_bool(*x) ? 3 : 4;
于 2012-12-04T21:35:57.137 に答える
6

これは、そのエラーの正しいコードではありません。xエラーは、からfooに変換できないことを示していますが、boolではなくxです。abool 1に変換可能であるため、指定したコードにエラーはありません。foofoo*foo*

オブジェクトを条件として使用できるようにする場合は、クラスにメンバー関数fooを提供する必要があります。operator boolfoo

struct foo {
  int bar;
  operator bool() { return true; }
};
foo x;
int y = x ? 3 : 4;

この場合、 anyfooは常に と評価されtrueます。オブジェクトが予期しない場所でに変換される可能性があるため、この への変換boolは「安全ではない」と見なされます。boolこれを回避するには、C++03 ではセーフ bool イディオムoperator boolを使用でき、C++11 ではasをマークできますexplicit

struct foo {
  int bar;
  explicit operator bool() { return true; }
};

は、ステートメントやループexplicit operator boolの条件など、特定の場所で自動的に使用されます。これをカバーする他の答えがあります。ifwhile


1算術、スコープなし列挙、ポインター、またはメンバー型へのポインターの prvalue は、 type の prvalue に変換できますbool。ゼロ値、ヌル ポインター値、またはヌル メンバー ポインター値は に変換されfalseます。その他の値は に変換されtrueます。

于 2012-12-04T21:36:29.853 に答える