Подтвердить что ты не робот

В чем смысл "operator bool() const"

Например:

operator bool() const 
{ 
    return col != 0; 
}

col - это int. Как работает operator bool() const?

4b9b3361

Ответ 1

Функции-члены формы

operator TypeName()

- операторы преобразования. Они позволяют использовать объекты типа класса, как если бы они были типа TypeName, а когда они есть, они преобразуются в TypeName с помощью функции преобразования.

В этом конкретном случае operator bool() позволяет использовать объект типа класса, как если бы он был bool. Например, если у вас есть объект типа класса с именем obj, вы можете использовать его как

if (obj)

Это вызовет operator bool(), вернет результат и будет использовать результат как условие if.

Следует отметить, что operator bool() - это очень плохая идея, и вы никогда не должны ее использовать. Подробное объяснение того, почему это плохо, и для решения проблемы, см. "Идиома безопасного була."

(С++ 0x, предстоящая ревизия стандарта С++, добавляет поддержку явным операторам преобразования, что позволит вам написать безопасный explicit operator bool(), который работает правильно, не перепрыгивая через обручи реализации Safe Bool Фразеологизм.)

Ответ 2

operator bool() const 
{
    return col != 0;
}

Определяет способ преобразования класса в логическое значение, const после () используется для указания, что этот метод не мутирует (меняет членов этого класса).

Обычно вы используете такие операторы следующим образом:

airplaysdk sdkInstance;
if (sdkInstance) {
    std::cout << "Instance is active" << std::endl;
} else {
    std::cout << "Instance is in-active error!" << std::endl;
}

Ответ 3

Я хотел бы дать больше кодов, чтобы было ясно.

struct A
{
    operator bool() const { return true; }
};

struct B
{
    explicit operator bool() const { return true; }
};

int main()
{
    A a1;
    if (a1) cout << "true" << endl; // OK: A::operator bool()
    bool na1 = a1; // OK: copy-initialization selects A::operator bool()
    bool na2 = static_cast<bool>(a1); // OK: static_cast performs direct-initialization

    B b1;     
    if (b1) cout << "true" << endl; // OK: B::operator bool()
    // bool nb1 = b1; // error: copy-initialization does not consider B::operator bool()
    bool nb2 = static_cast<bool>(b1); // OK: static_cast performs direct-initialization
}

Ответ 4

Это пользовательская функция преобразования implicit для преобразования вашего класса в true или false.

//usage
bool value = yourclassinstance; //yourclassinstance is converted into bool!

Ответ 5

Это неявное преобразование в bool. То есть везде, где допускаются неявные преобразования, ваш класс может быть преобразован в bool путем вызова этого метода.

Ответ 6

Как говорили другие, это для преобразования типов, в данном случае в bool. Например:

class A {
    bool isItSafe;

public:
    operator bool() const
    {
        return isItSafe;
    }

    ...
};

Теперь я могу использовать объект этого класса, как если бы он был логическим:

A a;
...
if (a) {
    ....
}

Ответ 7

Еще одно распространенное использование для контейнеров std для сравнения равенства значений ключей внутри пользовательских объектов

class Foo
{
    public: int val;
};

class Comparer { public:
bool operator () (Foo& a, Foo&b) const {
return a.val == b.val; 
};

class Blah
{
std::set< Foo, Comparer > _mySet;
};