С++ преобразовать класс в boolean
Со всеми основными типами С++ можно просто запросить:
if(varname)
и тип преобразуется в логическое значение для оценки. Есть ли способ воспроизвести эту функциональность в определенном пользователем классе? Один из моих классов идентифицируется целым числом, хотя он имеет несколько других членов, и я хотел бы иметь возможность проверить, установлено ли целое число в NULL таким образом.
Спасибо.
Ответы
Ответ 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
С++ проверяет, является ли результат выражения равным нулю или нет. Поэтому я думаю, вы можете определить оператор равенства для своего класса и определить, как ваш класс будет отличаться от нуля, в каких условиях.