web-dev-qa-db-ja.com

VARIANT_BOOLをC ++ブール値に最適に変換する方法は?

COMを使用する場合、ブール値はVARIANT_BOOLとして渡されます。これは、wtypes.hでshortとして宣言されています。 trueおよびfalseの定義済みの値もあります。

#define VARIANT_TRUE ((VARIANT_BOOL)-1)
#define VARIANT_FALSE ((VARIANT_BOOL)0)

VARIANT_BOOLからC++ bool型に変換する最良の方法はどれですか?明らかなバリアントは次のとおりです。

  1. vARIANT_FALSEと比較してください

  2. 単にboolにキャストする

他の方法は簡単に考案できます。

これを行うための最良の方法はどれですか?最も読みやすく、最も標準に準拠し、偶発的なバグが発生しにくく、64ビットプラットフォームへの移植に関する問題が発生しにくいですか?

23
sharptooth

VARIANT_FALSEと比較してください。 VARIANT_BOOLを期待する関数にC++ bool true値(整数値1にキャスト)を誤って渡すバグのあるコードがたくさんあります。 VARIANT_FALSEと比較すると、正しい期待値が得られます。

30

異なるブール値間の互換性について心配する必要はないので、通常は次のように記述します。

VARIANT_BOOL vb_bool = VARIANT_FALSE;

// ... vb_bool set to something by some other code

bool myBool = (vb_bool == VARIANT_TRUE);

(「より単純なx86コードにコンパイルする」のように)より小さな、それを行うための有効な方法はありますか?もちろん。それだけの価値はありません。これは確実に機能するので、ビジネスロジックについて心配することができます。

10
Euro Micelli

Boolへのキャストは明らかに間違っています。 VARIANT_FALSEと比較すると言う人もいますが(例: BOOL vs. VARIANT_BOOL vs. BOOLEAN vs. bool )、両方と比較します。そうすれば、無効な値(VARIANT_FALSEまたはVARIANT_TRUE以外)を早期にキャッチできます。

例えば.

bool VariantBoolToBool(VARIANT_BOOL varFlag)
{
  bool boolFlag;

  switch( varFlag ) 
  {
    case VARIANT_TRUE:
        boolFlag = true;
        break;
    case VARIANT_FALSE:
        boolFlag = false;
        break;
    default:
        throw Exception("Not a valid value");
  }

  return boolFlag;
}
4

グローバルヘッダーの1つでこのマクロを宣言します。

#define b(X) ((X)!=VARIANT_FALSE)


編集:はるかに安全なバージョン:

inline bool b(VARIANT_BOOL v){return v!=VARIANT_FALSE;}
2
Jesus Fernandez

なぜ明示的なキャストがあるのですか?

if (my_bool)
{
    blargh();
}
else
{
   blarglerr();
}

このように、C標準に従って、trueはtrueで、falseはfalseです。 C++スタイルboolを設定する必要がある場合は、次のようにします。

VARIANT_BOOL vb_bool = VARIANT_FALSE
bool cpp_bool = !!vb_bool
1
Pod

標準のC++変換ルールは、falseを意味するゼロに依存しています[1800 INFORMATIONが指摘しているように、TRUEバリアントが最も混乱する場所です]。したがって、static_castが最適です。

しかし、多くの場合、コードは比較として読みやすくなります。その場合、VARIANT_BOOLが比較対象になります。

0
Ruben Bartelink