Подтвердить что ты не робот

Как лучше всего преобразовать 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 типа? Очевидные варианты:

  • сравнить с VARIANT_FALSE

  • просто отбрасывать в bool

Другие способы можно легко придумать.

Каков наилучший способ сделать это - наиболее читаемый, самый стандартно-совместимый, наименее склонный к посадке на клонированных клоках и наименее подверженный проблемам с портированием на 64-битные платформы?

4b9b3361

Ответ 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 - это то, с чем нужно сравнивать.