C++ преобразовывает класс в булевскую переменную

Со всеми фундаментальными типами C++ можно просто запросить:

if(varname)

и тип преобразовывается в булевскую переменную для оценки. Там какой-либо путь состоит в том, чтобы копировать эту функциональность в пользовательском классе? Один из моих классов определяется целым числом, хотя он имеет много других участников, и я хотел бы смочь проверить, устанавливается ли целое число в NULL таким способом.

Спасибо.

25
задан Stop Harming Monica 20 December 2010 в 09:57
поделиться

4 ответа

Вы можете определить пользовательский оператор преобразования. Это должна быть функция-член, например: [

class MyClass {
  operator int() const
  { return your_number; }
  // other fields
};

] Вы также можете реализовать оператор bool. Однако я бы НАСТОЯТЕЛЬНО предлагал не делать этого, потому что ваш класс станет пригодным для использования в арифметических выражениях, что может быстро привести к беспорядку. IOStreams определяют, например, преобразование в void * . Вы можете протестировать void * точно так же, как вы можете протестировать bool , но не существует неявных преобразований, определяемых языком, из void * . Другой альтернативой является определение оператора ! с желаемой семантикой.

Вкратце: определение оператора преобразования в целочисленные типы (включая логические) - ДЕЙСТВИТЕЛЬНО плохая идея.

23
ответ дан 28 November 2019 в 18:05
поделиться

Просто реализуйте оператор bool() для вашего класса.

например,

class Foo
{
public:
    Foo(int x) : m_x(x) { }
    operator bool() const { return (0 != m_x); }
private:
    int m_x;
}

Foo a(1);
if (a) { // evaluates true
    // ...
}

Foo b(-1);
if (b) { // evaluates true
    // ...
}

Foo c(0);
if (c) { // evaluates false
    // ...
}
9
ответ дан 28 November 2019 в 18:05
поделиться

C ++ проверяет, равен ли результат операторов нулю или нет. Итак, я думаю, вы можете определить оператор равенства для своего класса и определить, как ваш класс будет отличаться от нуля в каких условиях.

-1
ответ дан 28 November 2019 в 18:05
поделиться

Как утверждали другие, использование оператора int () или оператора bool () является плохой идеей из-за допустимых преобразований. Лучше использовать указатель. На данный момент лучшее известное решение этой проблемы - вернуть указатель на член (функцию):

class MyClass {
  void some_function () {}

  typedef void (MyClass:: * safe_bool_type) ();
  operator safe_bool_type () const
  { return cond ? &MyClass::some_function : 0; }
};
4
ответ дан 28 November 2019 в 18:05
поделиться
Другие вопросы по тегам:

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