当使用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位平台的问题?
答案 0 :(得分:29)
与VARIANT_FALSE
比较。有很多错误的代码错误地将C ++ bool true
值(强制转换为整数值1)传递给期望VARIANT_BOOL
的函数。如果您与VARIANT_FALSE
进行比较,您仍会获得正确的预期值。
答案 1 :(得分:10)
我不想担心不同布尔值之间的兼容性,所以我通常会写:
VARIANT_BOOL vb_bool = VARIANT_FALSE;
// ... vb_bool set to something by some other code
bool myBool = (vb_bool == VARIANT_TRUE);
是否有更小的(如“将编译为更简单的x86代码”),有效的方法吗?当然。不值得。这保证有效,所以我可以担心我的业务逻辑。
答案 2 :(得分:4)
施展布尔显然是错误的。有人说(例如BOOL vs. VARIANT_BOOL vs. BOOLEAN vs. bool处的评论)与VARIANT_FALSE比较,但我会比较两者。这样你就可以尽早捕获无效值(除VARIANT_FALSE或VARIANT_TRUE之外的任何值)。
e.g。
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;
}
答案 3 :(得分:1)
为什么要进行明确演员?
if (my_bool)
{
blargh();
}
else
{
blarglerr();
}
这样,按照C标准,true为true,false为false。如果您需要设置C ++样式bool
,请执行以下操作:
VARIANT_BOOL vb_bool = VARIANT_FALSE
bool cpp_bool = !!vb_bool
答案 4 :(得分:1)
在您的一个全局标题中声明此宏。
#define b(X) ((X)!=VARIANT_FALSE)
编辑:更安全的版本:
inline bool b(VARIANT_BOOL v){return v!=VARIANT_FALSE;}
答案 5 :(得分:0)
标准C ++转换规则依赖零意味着错误[并且1800信息指出,TRUE变体是最混乱发生的地方]仅此而已。因此,static_cast最好。
但在许多情况下,代码作为比较更具可读性。在这种情况下,VARIANT_BOOL可以与之比较。