www tuto try tipos funcion code casteo cast c++ operators implicit-conversion conversion-operator

c++ - tuto - ¿Cuál es el significado de "operador bool() const"



try on c++ (7)

Por ejemplo:

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

col es un int. ¿Cómo funciona el operator bool() const ?


Como han dicho los otros, es para conversión de tipo, en este caso para bool . Por ejemplo:

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

Ahora puedo usar un objeto de esta clase como si fuera un booleano:

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


Es una conversión implícita a bool . Es decir, siempre que se permitan las conversiones implícitas, su clase se puede convertir a bool llamando a ese método.


Es una función de conversión implicit definida por el usuario para convertir su clase en true o false .

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


Funciones miembro de la forma

operator TypeName()

son operadores de conversión. Permiten que los objetos del tipo de clase se usen como si fueran de tipo TypeName y, cuando lo son, se convierten a TypeName utilizando la función de conversión.

En este caso particular, el operator bool() permite que un objeto del tipo de clase se use como si fuera un bool . Por ejemplo, si tiene un objeto del tipo de clase llamado obj , puede usarlo como

if (obj)

Esto llamará al operator bool() , devolverá el resultado y usará el resultado como condición del if .

Cabe señalar que el operator bool() es una muy mala idea y realmente nunca deberías usarla. Para una explicación detallada de por qué es malo y para la solución del problema, consulte "The Safe Bool Idiom".

(C ++ 0x, la próxima revisión del estándar C ++, agrega soporte para operadores de conversión explícitos. Estos le permitirán escribir un explicit operator bool() seguro explicit operator bool() que funciona correctamente sin tener que pasar por los aros de implementar el idioma de Safe Bool .)


Me gustaría dar más códigos para dejarlo en claro.

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 }


Otro uso común es que los contenedores estándar realicen una comparación de igualdad en valores clave dentro de objetos personalizados.

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


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

Define cómo se puede convertir la clase a un valor booleano, la const después de que () se usa para indicar que este método no cambia (cambia los miembros de esta clase).

Por lo general, utilizaría estos operadores de la siguiente manera:

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