如何最好地将 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 中声明为 short。 true 和 false 也有预定义的值:
#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?的主要内容,如果未能解决你的问题,请参考以下文章
如何最好地将 ClientRect / DomRect 转换为普通对象
如何最好地将 SparkSQL Dataframe Array[String] 列转换为新的 [String] 列
如何最好地将 CString 转换为 BSTR 以将其作为“in”参数传递给 COM 方法?
如何最好地将使用一个 UIViewController 将所有页面作为 UIView 处理为 StoryBoarding 和 UIPageView 的图书应用程序转换?