Со всеми фундаментальными типами C++ можно просто запросить:
if(varname)
и тип преобразовывается в булевскую переменную для оценки. Там какой-либо путь состоит в том, чтобы копировать эту функциональность в пользовательском классе? Один из моих классов определяется целым числом, хотя он имеет много других участников, и я хотел бы смочь проверить, устанавливается ли целое число в NULL таким способом.
Спасибо.
Вы можете определить пользовательский оператор преобразования. Это должна быть функция-член, например: [
class MyClass {
operator int() const
{ return your_number; }
// other fields
};
] Вы также можете реализовать оператор bool. Однако я бы НАСТОЯТЕЛЬНО предлагал не делать этого, потому что ваш класс станет пригодным для использования в арифметических выражениях, что может быстро привести к беспорядку. IOStreams определяют, например, преобразование в void *
. Вы можете протестировать void *
точно так же, как вы можете протестировать bool
, но не существует неявных преобразований, определяемых языком, из void *
. Другой альтернативой является определение оператора !
с желаемой семантикой.
Вкратце: определение оператора преобразования в целочисленные типы (включая логические) - ДЕЙСТВИТЕЛЬНО плохая идея.
Просто реализуйте оператор 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
// ...
}
C ++ проверяет, равен ли результат операторов нулю или нет. Итак, я думаю, вы можете определить оператор равенства для своего класса и определить, как ваш класс будет отличаться от нуля в каких условиях.
Как утверждали другие, использование оператора int ()
или оператора bool ()
является плохой идеей из-за допустимых преобразований. Лучше использовать указатель. На данный момент лучшее известное решение этой проблемы - вернуть указатель на член (функцию):
class MyClass {
void some_function () {}
typedef void (MyClass:: * safe_bool_type) ();
operator safe_bool_type () const
{ return cond ? &MyClass::some_function : 0; }
};