如何将VARIANT_BOOL转换为C ++ bool?

当使用COM时,布尔值将作为在wtypes.h中声明的VARIANT_BOOL传递。 还有预定义的值和值:

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

将VARIANT_BOOL转换为C ++ booltypes的最佳方法是什么? 明显的变体是:

  1. 与VARIANT_FALSE比较

  2. 简单地投给布尔

其他方式可以很容易地发明。

哪种方法是最好的 – 最可读性,最符合标准的兼容性,最不容易受到错误植入的问题,而且最不容易出现移植到64位平台的问题。

比较VARIANT_FALSE 。 在那里有很多错误的代码错误地将C ++ bool true值(转换为整数值1)传递给期望VARIANT_BOOL的函数。 如果你比较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_BOOL和BOOLEAN对布尔的评论) 与VARIANT_FALSE比较,但是我会比较两者。 这样你就可以尽早地捕获无效值(除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; } 

为什么要有明确的演员?

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

按照C标准,这是真的,假的是假的。 如果你需要设置一个C ++风格的bool然后做一些事情:

 VARIANT_BOOL vb_bool = VARIANT_FALSE bool cpp_bool = !!vb_bool 

在你的一个全局头文件中声明这个宏。

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

编辑:更安全的版本:

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

标准的C ++转换规则依赖于零意义的错误[而且正如1800信息所指出的那样,TRUE变体是最容易发生混淆的地方],仅此而已。 因此,static_cast将是最好的。

但是在很多情况下,代码会比较可读性更好。 在这种情况下,VARIANT_BOOL是比较的东西。