Предположим, у меня есть пользовательская оболочка вокруг примитивного типа C++:
class myInt
{
public:
/*stuff here*/
private:
unsigned int data;
}
Как я могу сделать
myInt mi;
if(mi){...}
вести себя так, как вы ожидаете от нормального целого?
Все, о чем я могу думать, это написать явный логический листинг или, возможно, переопределить оператор ==.
Что-то вроде:
if(bool(mi)){...}
if(mi.toBool()){...}
if(mi==true){..}
Все это служит цели, но выглядит довольно уродливым и искусственным.
Есть ли другой вариант, которого я не вижу?
Вы можете сделать свой следующий оператор трансляции, например:
class myInt
{
public:
operator bool() const { return data != 0; }
private:
unsigned int data;
}
По умолчанию подразумевается (это означает, что он будет использоваться каждый раз, когда компилятор считает, что ему нужен bool, и вы предоставляете myInt). Поскольку С++ 11 вы можете пометить его как явное, заставляя использование ограничиваться явным броском, до этого он всегда был неявным.
Но вы должны заметить, что это часто плохая идея, и ее следует избегать: проверьте идиому безопасного bool для большей лекции.
Другой вариант, близкий к вашему желанию, и намного безопаснее - это перегрузка !
оператор:
class myInt
{
public:
bool operator!() const { return data == 0; }
private:
unsigned int data;
}
Лучший вариант - полностью удалить обертку.