Как лучше всего преобразовать VARIANT_BOOL в C++ bool?

Вот простой класс, который обрабатывает файлы raw и asset:

открытый класс ReadFromFile {

public static String raw(Context context, @RawRes int id) {
    InputStream is = context.getResources().openRawResource(id);
    int size = 0;
    try {
        size = is.available();
    } catch (IOException e) {
        e.printStackTrace();
        return "";
    }
    return readFile(size, is);
}

public static String asset(Context context, String fileName) {
    InputStream is = null;
    int size = 0;
    try {
        is = context.getAssets().open(fileName);
        AssetFileDescriptor fd = null;
        fd = context.getAssets().openFd(fileName);
        size = (int) fd.getLength();
        fd.close();
    } catch (IOException e) {
        e.printStackTrace();
        return "";
    }
    return readFile(size, is);
}


private static String readFile(int size, InputStream is) {
    try {
        byte buffer[] = new byte[size];
        is.read(buffer);
        is.close();
        return new String(buffer);
    } catch (Exception e) {
        e.printStackTrace();
        return "";
    }
}

}

Например:

ReadFromFile.raw(context, R.raw.textfile);

И для файлов активов:

ReadFromFile.asset(context, "file.txt");
22
задан sharptooth 20 May 2009 в 08:07
поделиться

6 ответов

Сравните с VARIANT_FALSE . Существует много ошибочного кода, который ошибочно передает значение C ++ bool true (приведенное к целочисленному значению 1) функции, ожидающей VARIANT_BOOL . Если вы сравните с VARIANT_FALSE , вы все равно получите правильное ожидаемое значение.

29
ответ дан 29 November 2019 в 04:29
поделиться

Приведение к типу bool явно неверно. Некоторые люди говорят (например, комментарии на BOOL vs. VARIANT_BOOL vs. 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
ответ дан 29 November 2019 в 04:29
поделиться

Зачем нужно явное приведение?

if (my_bool)
{
    blargh();
}
else
{
   blarglerr();
}

Таким образом, true - это истина, а false - ложь, в соответствии со стандартом C. Если вам нужно УСТАНОВИТЬ стиль C ++ bool , сделайте что-нибудь вроде:

VARIANT_BOOL vb_bool = VARIANT_FALSE
bool cpp_bool = !!vb_bool
1
ответ дан 29 November 2019 в 04:29
поделиться

Объявите этот макрос в одном из ваших глобальных заголовков.

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


РЕДАКТИРОВАТЬ: Более безопасная версия:

inline bool b(VARIANT_BOOL v){return v!=VARIANT_FALSE;}
1
ответ дан 29 November 2019 в 04:29
поделиться

Стандартные правила преобразования C ++ полагаются на ноль, означающий ложь [и, как указывает 1800 ИНФОРМАЦИЯ, ИСТИННЫЙ вариант - это то место, где происходит наибольшая путаница] и ничего более. Следовательно, лучше всего будет static_cast.

Но во многих случаях код будет более читаемым для сравнения. В этом случае сравнивать VARIANT_BOOL.

В ИСТИННОМ варианте происходит наибольшая путаница] и не более того. Следовательно, лучше всего будет static_cast.

Но во многих случаях код будет более читаемым для сравнения. В этом случае сравнивать VARIANT_BOOL.

В ИСТИННОМ варианте происходит наибольшая путаница] и не более того. Следовательно, лучше всего будет static_cast.

Но во многих случаях код будет более читаемым для сравнения. В этом случае сравнивать VARIANT_BOOL.

0
ответ дан 29 November 2019 в 04:29
поделиться

Мне не нравится беспокоиться о совместимости между разными логическими значениями, поэтому я обычно пишу:

VARIANT_BOOL vb_bool = VARIANT_FALSE;

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

bool myBool = (vb_bool == VARIANT_TRUE);

Есть ли более мелкие (например, «компилируется в более простой код x86») , действительные способы сделать это? Конечно. Не стоит. Это гарантированно сработает, поэтому я могу беспокоиться о своей бизнес-логике.

10
ответ дан 29 November 2019 в 04:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: