в 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++ проверяет, равен ли результат операторов нулю или нет. Поэтому я думаю, что вы можете определить оператор равенства для своего класса и определить, как ваш класс будет отличаться от нуля в каких условиях.