Как лучше всего преобразовать VARIANT_BOOL в С++ bool?
При использовании COM-булевых значений должны быть переданы как VARIANT_BOOL, который объявлен в wtypes.h как короткий. Существуют также предопределенные значения для true и false:
#define VARIANT_TRUE ((VARIANT_BOOL)-1)
#define VARIANT_FALSE ((VARIANT_BOOL)0)
Каков наилучший способ преобразования из VARIANT_BOOL в С++ bool
типа? Очевидные варианты:
Другие способы можно легко придумать.
Каков наилучший способ сделать это - наиболее читаемый, самый стандартно-совместимый, наименее склонный к посадке на клонированных клоках и наименее подверженный проблемам с портированием на 64-битные платформы?
Ответы
Ответ 1
Сравните с VARIANT_FALSE
. Существует много ошибочного кода, который ошибочно передает значение Cool 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 против VARIANT_BOOL против BOOLEAN vs. bool), чтобы сравнить с 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;
}
Ответ 4
Почему есть явный листинг?
if (my_bool)
{
blargh();
}
else
{
blarglerr();
}
Таким образом, true - true, а false - false, согласно стандарту C. Если вам нужно установить стиль С++ bool
, тогда сделайте что-то вроде:
VARIANT_BOOL vb_bool = VARIANT_FALSE
bool cpp_bool = !!vb_bool
Ответ 5
Объявите этот макрос в одном из ваших глобальных заголовков.
#define b(X) ((X)!=VARIANT_FALSE)
EDIT: гораздо более безопасная версия:
inline bool b(VARIANT_BOOL v){return v!=VARIANT_FALSE;}
Ответ 6
Стандартные правила преобразования С++ полагаются на нуль, что означает false [и, как указывает 1800 ИНФОРМАЦИЯ, вариант TRUE - это то место, где происходит большая путаница] и ничего больше. Следовательно, static_cast будет лучше.
Но во многих случаях код был бы более читабельным в качестве сравнения. В этом случае VARIANT_BOOL - это то, с чем нужно сравнивать.