【问题标题】:How to best convert VARIANT_BOOL to C++ bool?如何最好地将 VARIANT_BOOL 转换为 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 类型的最佳方法是什么?明显的变体是:

  1. 与 VARIANT_FALSE 比较

  2. 简单地转换为 bool

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

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

【问题讨论】:

    标签: c++ windows com interop boolean


    【解决方案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 是比较的对象。

      【讨论】:

        猜你喜欢
        • 2014-06-20
        • 2010-09-10
        • 2011-03-29
        • 1970-01-01
        • 2010-12-30
        • 2011-04-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多