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

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

if(varname)

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

спасибо.

5 ответов


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

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

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

короче говоря: определение оператора преобразования sto целочисленных типов (включая логические) - действительно плохая идея.


подход C++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 ключевое слово, которое предотвращает неявное преобразование компилятора.


просто реализовать 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
    // ...
}

как использовать 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; }
};

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