Как я могу вернуть значение из объекта класса? - PullRequest
4 голосов
/ 08 августа 2010

Возможно ли, чтобы объект класса возвращал значение true / false, поэтому я могу сделать что-то вроде этого:

MyClass a;
...
if (a)
    do_something();

Я могу достичь (почти) того, что хочу, перегружая! Оператор:

class MyClass {
    ...
    bool operator!() const { return !some_condition; };
    ...
}

main()
    MyClass a;
    ...
    if (!a)
        do_something_different();

но я не нашел способа перегрузить то, что было бы «пустым» оператором. Конечно, использование оператора == для проверки истинности / ложности также возможно, и на самом деле это то, что я делал до сих пор.

Ответы [ 4 ]

8 голосов
/ 08 августа 2010

Перегрузка оператора void *:

operator void * () const { return some_condition; };

Вот как работают потоки, позволяя вам сказать:

if ( cin ) {
   // stream is OK
}

Использование void * вместо bool предотвращает ошибочное использование приведения в некоторых контекстах, таких как арифметика, где это нежелательно. Если, конечно, вы не захотите использовать его в этих условиях.

6 голосов
/ 08 августа 2010

Очевидное решение - обеспечить неявное преобразование в bool через operator bool - плохая идея.

Вот почему стандартная библиотека использует operator void*, как показано в ответе Нила.

Однако стоит отметить, что даже это решение имеет недостатки и поэтому более не считается безопасным. К сожалению, придумать лучшее решение не так просто ...

В Artima есть статья, описывающая идиому safe bool . Для настоящей библиотеки это определенно правильный путь, поскольку она предлагает самый надежный интерфейс, который сложнее всего использовать неправильно.

5 голосов
/ 08 августа 2010

Странно, до сих пор никто не упомянул идиому safe bool . Все другие решения, описанные до сих пор, имеют недостатки (о которых вы можете заботиться или не заботиться), все эти подходы описаны в статье. Короче говоря, идиома безопасного bool выглядит примерно так:

  class Testable {
    typedef void (Testable::*bool_type)() const;
    void this_type_does_not_support_comparisons() const {}
  public:
    operator bool_type() const {
      return /* condition here */ ? 
        &Testable::this_type_does_not_support_comparisons  // true value
        : 0; // false value
    }
  };
0 голосов
/ 08 августа 2010

Попробуйте перегрузить оператор (bool):

operator bool() { /* ... */ }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...