Ответ 1
Вы можете преобразовать свой объект в логическое значение, указав operator bool()
:
explicit operator bool() const
{
return foo.getX();
}
Ключевое слово explicit
предотвращает неявные преобразования от Foo
до bool
. Например, если вы случайно положили Foo
в арифметическое выражение типа foo + 1
, компилятор мог обнаружить эту ошибку, если объявить operator bool()
как explicit
, иначе Foo
будет преобразован в bool
, даже если не предназначен.
В общем случае функции-члены вида
operator TypeName()
(с необязательным explicit
и const
классификатором) являются операторами преобразования. Он позволяет отнести ваш класс к любому типу, указанному в TypeName
. В другом направлении конструкторы с одним аргументом позволяют вам использовать любой тип для вашего класса:
class Foo {
Foo(int x); // convert int to Foo
operator bool() const; // convert Foo to bool
int x;
};
Это определяет неявные преобразования для вашего класса. Компилятор пытается применить эти преобразования, если это возможно (например, что он делает для встроенных типов данных, например 5 + 1.0
). Вы можете объявить их explicit
для подавления нежелательных неявных преобразований.