如何最好地将VARIANT_BOOL转换为C ++ bool?

时间:2009-05-20 08:07:31

标签: c++ windows com interop boolean

当使用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

  3. 其他方式很容易发明。

    这是最好的方法 - 最可读,最符合标准,最不容易出现种植错误,最不容易出现移植到64位平台的问题?

6 个答案:

答案 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可以与之比较。