COMを使用する場合、ブール値はVARIANT_BOOLとして渡されます。これは、wtypes.hでshortとして宣言されています。 trueおよびfalseの定義済みの値もあります。
#define VARIANT_TRUE ((VARIANT_BOOL)-1)
#define VARIANT_FALSE ((VARIANT_BOOL)0)
VARIANT_BOOLからC++ bool
型に変換する最良の方法はどれですか?明らかなバリアントは次のとおりです。
vARIANT_FALSEと比較してください
単にboolにキャストする
他の方法は簡単に考案できます。
これを行うための最良の方法はどれですか?最も読みやすく、最も標準に準拠し、偶発的なバグが発生しにくく、64ビットプラットフォームへの移植に関する問題が発生しにくいですか?
VARIANT_FALSE
と比較してください。 VARIANT_BOOL
を期待する関数にC++ bool true
値(整数値1にキャスト)を誤って渡すバグのあるコードがたくさんあります。 VARIANT_FALSE
と比較すると、正しい期待値が得られます。
異なるブール値間の互換性について心配する必要はないので、通常は次のように記述します。
VARIANT_BOOL vb_bool = VARIANT_FALSE;
// ... vb_bool set to something by some other code
bool myBool = (vb_bool == VARIANT_TRUE);
(「より単純なx86コードにコンパイルする」のように)より小さな、それを行うための有効な方法はありますか?もちろん。それだけの価値はありません。これは確実に機能するので、ビジネスロジックについて心配することができます。
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;
}
グローバルヘッダーの1つでこのマクロを宣言します。
#define b(X) ((X)!=VARIANT_FALSE)
編集:はるかに安全なバージョン:
inline bool b(VARIANT_BOOL v){return v!=VARIANT_FALSE;}
なぜ明示的なキャストがあるのですか?
if (my_bool)
{
blargh();
}
else
{
blarglerr();
}
このように、C標準に従って、trueはtrueで、falseはfalseです。 C++スタイルbool
を設定する必要がある場合は、次のようにします。
VARIANT_BOOL vb_bool = VARIANT_FALSE
bool cpp_bool = !!vb_bool
標準のC++変換ルールは、falseを意味するゼロに依存しています[1800 INFORMATIONが指摘しているように、TRUEバリアントが最も混乱する場所です]。したがって、static_castが最適です。
しかし、多くの場合、コードは比較として読みやすくなります。その場合、VARIANT_BOOLが比較対象になります。