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

Posted

技术标签:

【中文标题】如何最好地将 VARIANT_BOOL 转换为 C++ bool?【英文标题】:How to best convert VARIANT_BOOL to C++ bool? 【发布时间】:2010-10-27 13:38:46 【问题描述】:

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

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

从 VARIANT_BOOL 转换为 C++ bool 类型的最佳方法是什么?明显的变体是:

    与 VARIANT_FALSE 比较

    简单地转换为 bool

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

最好的方法是什么 - 最易读、最符合标准、最不容易出现意外错误植入以及最不容易出现移植到 64 位平台的问题?

【问题讨论】:

【参考方案1】:

VARIANT_FALSE 比较。有很多错误的代码错误地将 C++ bool true 值(强制转换为整数值 1)传递给期望 VARIANT_BOOL 的函数。如果您与VARIANT_FALSE 进行比较,您仍然会得到正确的预期值。

【讨论】:

是的,但我认为最好修复该代码,或者如果您不控制它,则将其视为特殊情况。 我很少能完全控制客户端代码。我会将每个电话都视为特殊情况【参考方案2】:

我不喜欢担心不同布尔值之间的兼容性,所以我通常会这样写:

VARIANT_BOOL vb_bool = VARIANT_FALSE;

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

bool myBool = (vb_bool == VARIANT_TRUE);

是否有更小(如“将编译为更简单的 x86 代码”)的有效方法?当然。不值得。这保证有效,所以我可以担心我的业务逻辑。

【讨论】:

【参考方案3】:

转换为 bool 显然是错误的。有人说(例如BOOL vs. VARIANT_BOOL vs. BOOLEAN vs. bool 的 cmets)要与 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;

【讨论】:

也许断言(varFlag == VARIANT_FALSE || varFlag == VARIANT_TRUE)? 这值得考虑,但我更喜欢 C++ 应用程序中的异常。一个原因(除了异常的其他好处之外)是我认为检查应该在生产代码中,并且断言往往会被禁用。 一些检查应该在生产代码中进行,一些在开发代码中。我通常会在什么是程序员错误(例如,将 null-ptr 传递给不接受它的函数)和外部错误(例如,找不到某个文件)上画线。在我的书中,像这样的转换函数通常与程序员错误有关,而不是与外部错误有关。【参考方案4】:

在您的全局标题之一中声明此宏。

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

编辑:更安全的版本:

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

【讨论】:

拥有一个功能会更安全 - 编译器会在发布版本中内联它,并且可以在调试版本中单步执行。 嘿嘿嘿,现在的答案呢? :P 这个比较安全,但是通过引用传递 VARIANT_BOOL 确实没有意义。 是的,错了,我习惯于处理更复杂的数据类型并通过引用传递它。 既然你仍然在帖子中保留宏,你至少应该正确地支撑它:#define b(X) ((X) != VARIANT_FALSE)【参考方案5】:

为什么要有明确的演员表?

if (my_bool)

    blargh();

else

   blarglerr();

这样,根据 C 标准,真为真,假为假。如果您需要设置 C++ 样式 bool,请执行以下操作:

VARIANT_BOOL vb_bool = VARIANT_FALSE
bool cpp_bool = !!vb_bool

【讨论】:

意思是说!! - 不错!【参考方案6】:

标准 C++ 转换规则依赖于零表示 false [正如 1800 INFORMATION 指出的那样,TRUE 变体是最容易发生混淆的地方] 仅此而已。因此最好使用 static_cast。

但在许多情况下,作为比较,代码会更具可读性。在这种情况下,VARIANT_BOOL 是比较的对象。

【讨论】:

以上是关于如何最好地将 VARIANT_BOOL 转换为 C++ bool?的主要内容,如果未能解决你的问题,请参考以下文章

如何最好地将字符串表示形式转换为 DbType?

如何最好地将 ClientRect / DomRect 转换为普通对象

如何最好地将 SparkSQL Dataframe Array[String] 列转换为新的 [String] 列

如何最好地将 CString 转换为 BSTR 以将其作为“in”参数传递给 COM 方法?

如何最好地将使用一个 UIViewController 将所有页面作为 UIView 处理为 StoryBoarding 和 UIPageView 的图书应用程序转换?

如何正确地将数据帧的所有日期时间列转换为 iso 格式