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

С++ преобразовать класс в boolean

Со всеми основными типами С++ можно просто запросить:

if(varname)

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

Спасибо.

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

Подход С++ 11:

struct Testable
  {
    explicit operator bool() const
      { return false; }
  };

int main ()
  {
    Testable a, b;
    if (a)      { /* do something  */ }  // this is correct
    if (a == b) { /* do something  */ }  // compiler error
  }

Обратите внимание на ключевое слово explicit, которое предотвращает неявное преобразование компилятора.

Ответ 3

Просто реализуйте operator 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
    // ...
}

Ответ 4

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

class MyClass {
  void some_function () {}

  typedef void (MyClass:: * safe_bool_type) ();
  operator safe_bool_type () const
  { return cond ? &MyClass::some_function : 0; }
};

Ответ 5

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