Преобразование пользовательской целочисленной оболочки в логическое значение

0

Предположим, у меня есть пользовательская оболочка вокруг примитивного типа C++:

class myInt
{
    public:
        /*stuff here*/
    private:
        unsigned int data;
}

Как я могу сделать

myInt mi;  
if(mi){...}  

вести себя так, как вы ожидаете от нормального целого?
Все, о чем я могу думать, это написать явный логический листинг или, возможно, переопределить оператор ==.
Что-то вроде:

if(bool(mi)){...}
if(mi.toBool()){...}
if(mi==true){..}

Все это служит цели, но выглядит довольно уродливым и искусственным.
Есть ли другой вариант, которого я не вижу?

Теги:
type-conversion
wrapper
boolean

2 ответа

3
Лучший ответ

Вы можете сделать свой следующий оператор трансляции, например:

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;
}
4

Лучший вариант - полностью удалить обертку.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню