Por ejemplo:
operator bool() const
{
return col != 0;
}
col
es un int. ¿Cómo operator bool() const
funciona?
Por ejemplo:
operator bool() const
{
return col != 0;
}
col
es un int. ¿Cómo operator bool() const
funciona?
Funciones de miembro del formulario
operator TypeName()
son operadores de conversión. Permiten usar objetos del tipo de clase como si fueran de tipo TypeName
y cuando lo son, se convierten para TypeName
usar la función de conversión.
En este caso particular, operator bool()
permite utilizar un objeto del tipo de clase como si fuera un bool
. Por ejemplo, si tiene un objeto del tipo de clase nombrado obj
, puede usarlo como
if (obj)
Esto llamará operator bool()
, devolverá el resultado y usará el resultado como la condición de if
.
Cabe señalar que operator bool()
es una muy mala idea y que nunca debería utilizarla. Para obtener una explicación detallada de por qué es malo y la solución al problema, consulte "El idioma bool seguro".
(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 una caja fuerte explicit operator bool()
que funcione correctamente sin tener que pasar por los obstáculos de implementar Safe Bool Idiom).
bool
), no, no se puede asignar. Si fuera un lvalue modificable (pbool&
. Ej. ), Podría asignarle. En cuanto a la corrección, sostengo que anoperator bool()
es siempre incorrecto porque permite el uso de un objeto de tipo clase en una gran cantidad de situaciones en las que nunca se desea que se use. Safe Bool es una alternativa muy superior.explicit operator bool()
. ¿Entiendo correctamente?operator bool() const { return col != 0; }
Define cómo la clase se puede convertir a un valor booleano,
const
después de que()
se usa para indicar que este método no muta (cambia los miembros de esta clase)Por lo general, usaría los siguientes operadores:
airplaysdk sdkInstance; if (sdkInstance) { std::cout << "Instance is active" << std::endl; } else { std::cout << "Instance is in-active error!" << std::endl; }
fuente
Me gustaría dar más códigos para que quede 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 }
fuente
Es una
implicit
función de conversión definida por el usuario para convertir su clase entrue
ofalse
.//usage bool value = yourclassinstance; //yourclassinstance is converted into bool!
fuente
Es una conversión implícita a
bool
. Es decir, dondequiera que se permitan conversiones implícitas, su clase se puede convertirbool
llamando a ese método.fuente
Como han dicho los demás, es para la conversión de tipos, en este caso a
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) { .... }
fuente
Al escribir mi propio unique_ptr, encontré este caso. Dada
std::unique_ptr
@ soperator==
:template<class T1, class D1, class T2, class D2> bool operator==(const unique_ptr<T1, D1>& x, const unique_ptr<T2, D2>& y); template <class T, class D> bool operator==(const unique_ptr<T, D>& x, nullptr_t) noexcept; template <class T, class D> bool operator==(nullptr_t, const unique_ptr<T, D>& x) noexcept;
Y este caso de prueba de libstdcxx :
std::unique_ptr<int> ptr; if (ptr == 0) { } if (0 == ptr) { } if (ptr != 0) { } if (0 != ptr) { }
Tenga en cuenta que porque
ptr
tiene unexplicit operator bool() const noexcept;
, por lo queoperator overload resolution
funciona bien aquí, por ejemplo,ptr == 0
eligetemplate <class T, class D> bool operator==(const unique_ptr<T, D>& x, nullptr_t) noexcept;`.
Si no tiene una
explicit
palabra clave aquí,ptr
inptr == 0
se convertirá enbool
, luegobool
se convertirá enint
, porquebool operator==(int, int)
está integrado y0
esint
. Lo que nos espera es un error ambiguo de resolución de sobrecarga.Aquí hay un ejemplo mínimo, completo y verificable :
#include <cstddef> struct A { constexpr A(std::nullptr_t) {} operator bool() { return true; } }; constexpr bool operator ==(A, A) noexcept { return true; } constexpr bool operator ==(A, std::nullptr_t) noexcept { return true; } constexpr bool operator ==(std::nullptr_t, A) noexcept { return true; } int main() { A a1(nullptr); A a2(0); a1 == 0; }
gcc :
prog.cc: In function 'int main()': prog.cc:30:8: error: ambiguous overload for 'operator==' (operand types are 'A' and 'int') 30 | a1 == 0; | ~~ ^~ ~ | | | | A int prog.cc:30:8: note: candidate: 'operator==(int, int)' <built-in> 30 | a1 == 0; | ~~~^~~~ prog.cc:11:16: note: candidate: 'constexpr bool operator==(A, A)' 11 | constexpr bool operator ==(A, A) noexcept | ^~~~~~~~ prog.cc:16:16: note: candidate: 'constexpr bool operator==(A, std::nullptr_t)' 16 | constexpr bool operator ==(A, std::nullptr_t) noexcept | ^~~~~~~~
sonido metálico :
prog.cc:30:8: error: use of overloaded operator '==' is ambiguous (with operand types 'A' and 'int') a1 == 0; ~~ ^ ~ prog.cc:16:16: note: candidate function constexpr bool operator ==(A, std::nullptr_t) noexcept ^ prog.cc:11:16: note: candidate function constexpr bool operator ==(A, A) noexcept ^ prog.cc:30:8: note: built-in candidate operator==(int, int) a1 == 0; ^ prog.cc:30:8: note: built-in candidate operator==(float, int) prog.cc:30:8: note: built-in candidate operator==(double, int) prog.cc:30:8: note: built-in candidate operator==(long double, int) prog.cc:30:8: note: built-in candidate operator==(__float128, int) prog.cc:30:8: note: built-in candidate operator==(int, float) prog.cc:30:8: note: built-in candidate operator==(int, double) prog.cc:30:8: note: built-in candidate operator==(int, long double) prog.cc:30:8: note: built-in candidate operator==(int, __float128) prog.cc:30:8: note: built-in candidate operator==(int, long) prog.cc:30:8: note: built-in candidate operator==(int, long long) prog.cc:30:8: note: built-in candidate operator==(int, __int128) prog.cc:30:8: note: built-in candidate operator==(int, unsigned int) prog.cc:30:8: note: built-in candidate operator==(int, unsigned long) prog.cc:30:8: note: built-in candidate operator==(int, unsigned long long) prog.cc:30:8: note: built-in candidate operator==(int, unsigned __int128) prog.cc:30:8: note: built-in candidate operator==(long, int) prog.cc:30:8: note: built-in candidate operator==(long long, int) prog.cc:30:8: note: built-in candidate operator==(__int128, int) prog.cc:30:8: note: built-in candidate operator==(unsigned int, int) prog.cc:30:8: note: built-in candidate operator==(unsigned long, int) prog.cc:30:8: note: built-in candidate operator==(unsigned long long, int) prog.cc:30:8: note: built-in candidate operator==(unsigned __int128, int) prog.cc:30:8: note: built-in candidate operator==(float, float) prog.cc:30:8: note: built-in candidate operator==(float, double) prog.cc:30:8: note: built-in candidate operator==(float, long double) prog.cc:30:8: note: built-in candidate operator==(float, __float128) prog.cc:30:8: note: built-in candidate operator==(float, long) prog.cc:30:8: note: built-in candidate operator==(float, long long) prog.cc:30:8: note: built-in candidate operator==(float, __int128) prog.cc:30:8: note: built-in candidate operator==(float, unsigned int) prog.cc:30:8: note: built-in candidate operator==(float, unsigned long) prog.cc:30:8: note: built-in candidate operator==(float, unsigned long long) prog.cc:30:8: note: built-in candidate operator==(float, unsigned __int128) prog.cc:30:8: note: built-in candidate operator==(double, float) prog.cc:30:8: note: built-in candidate operator==(double, double) prog.cc:30:8: note: built-in candidate operator==(double, long double) prog.cc:30:8: note: built-in candidate operator==(double, __float128) prog.cc:30:8: note: built-in candidate operator==(double, long) prog.cc:30:8: note: built-in candidate operator==(double, long long) prog.cc:30:8: note: built-in candidate operator==(double, __int128) prog.cc:30:8: note: built-in candidate operator==(double, unsigned int) prog.cc:30:8: note: built-in candidate operator==(double, unsigned long) prog.cc:30:8: note: built-in candidate operator==(double, unsigned long long) prog.cc:30:8: note: built-in candidate operator==(double, unsigned __int128) prog.cc:30:8: note: built-in candidate operator==(long double, float) prog.cc:30:8: note: built-in candidate operator==(long double, double) prog.cc:30:8: note: built-in candidate operator==(long double, long double) prog.cc:30:8: note: built-in candidate operator==(long double, __float128) prog.cc:30:8: note: built-in candidate operator==(long double, long) prog.cc:30:8: note: built-in candidate operator==(long double, long long) prog.cc:30:8: note: built-in candidate operator==(long double, __int128) prog.cc:30:8: note: built-in candidate operator==(long double, unsigned int) prog.cc:30:8: note: built-in candidate operator==(long double, unsigned long) prog.cc:30:8: note: built-in candidate operator==(long double, unsigned long long) prog.cc:30:8: note: built-in candidate operator==(long double, unsigned __int128) prog.cc:30:8: note: built-in candidate operator==(__float128, float) prog.cc:30:8: note: built-in candidate operator==(__float128, double) prog.cc:30:8: note: built-in candidate operator==(__float128, long double) prog.cc:30:8: note: built-in candidate operator==(__float128, __float128) prog.cc:30:8: note: built-in candidate operator==(__float128, long) prog.cc:30:8: note: built-in candidate operator==(__float128, long long) prog.cc:30:8: note: built-in candidate operator==(__float128, __int128) prog.cc:30:8: note: built-in candidate operator==(__float128, unsigned int) prog.cc:30:8: note: built-in candidate operator==(__float128, unsigned long) prog.cc:30:8: note: built-in candidate operator==(__float128, unsigned long long) prog.cc:30:8: note: built-in candidate operator==(__float128, unsigned __int128) prog.cc:30:8: note: built-in candidate operator==(long, float) prog.cc:30:8: note: built-in candidate operator==(long, double) prog.cc:30:8: note: built-in candidate operator==(long, long double) prog.cc:30:8: note: built-in candidate operator==(long, __float128) prog.cc:30:8: note: built-in candidate operator==(long, long) prog.cc:30:8: note: built-in candidate operator==(long, long long) prog.cc:30:8: note: built-in candidate operator==(long, __int128) prog.cc:30:8: note: built-in candidate operator==(long, unsigned int) prog.cc:30:8: note: built-in candidate operator==(long, unsigned long) prog.cc:30:8: note: built-in candidate operator==(long, unsigned long long) prog.cc:30:8: note: built-in candidate operator==(long, unsigned __int128) prog.cc:30:8: note: built-in candidate operator==(long long, float) prog.cc:30:8: note: built-in candidate operator==(long long, double) prog.cc:30:8: note: built-in candidate operator==(long long, long double) prog.cc:30:8: note: built-in candidate operator==(long long, __float128) prog.cc:30:8: note: built-in candidate operator==(long long, long) prog.cc:30:8: note: built-in candidate operator==(long long, long long) prog.cc:30:8: note: built-in candidate operator==(long long, __int128) prog.cc:30:8: note: built-in candidate operator==(long long, unsigned int) prog.cc:30:8: note: built-in candidate operator==(long long, unsigned long) prog.cc:30:8: note: built-in candidate operator==(long long, unsigned long long) prog.cc:30:8: note: built-in candidate operator==(long long, unsigned __int128) prog.cc:30:8: note: built-in candidate operator==(__int128, float) prog.cc:30:8: note: built-in candidate operator==(__int128, double) prog.cc:30:8: note: built-in candidate operator==(__int128, long double) prog.cc:30:8: note: built-in candidate operator==(__int128, __float128) prog.cc:30:8: note: built-in candidate operator==(__int128, long) prog.cc:30:8: note: built-in candidate operator==(__int128, long long) prog.cc:30:8: note: built-in candidate operator==(__int128, __int128) prog.cc:30:8: note: built-in candidate operator==(__int128, unsigned int) prog.cc:30:8: note: built-in candidate operator==(__int128, unsigned long) prog.cc:30:8: note: built-in candidate operator==(__int128, unsigned long long) prog.cc:30:8: note: built-in candidate operator==(__int128, unsigned __int128) prog.cc:30:8: note: built-in candidate operator==(unsigned int, float) prog.cc:30:8: note: built-in candidate operator==(unsigned int, double) prog.cc:30:8: note: built-in candidate operator==(unsigned int, long double) prog.cc:30:8: note: built-in candidate operator==(unsigned int, __float128) prog.cc:30:8: note: built-in candidate operator==(unsigned int, long) prog.cc:30:8: note: built-in candidate operator==(unsigned int, long long) prog.cc:30:8: note: built-in candidate operator==(unsigned int, __int128) prog.cc:30:8: note: built-in candidate operator==(unsigned int, unsigned int) prog.cc:30:8: note: built-in candidate operator==(unsigned int, unsigned long) prog.cc:30:8: note: built-in candidate operator==(unsigned int, unsigned long long) prog.cc:30:8: note: built-in candidate operator==(unsigned int, unsigned __int128) prog.cc:30:8: note: built-in candidate operator==(unsigned long, float) prog.cc:30:8: note: built-in candidate operator==(unsigned long, double) prog.cc:30:8: note: built-in candidate operator==(unsigned long, long double) prog.cc:30:8: note: built-in candidate operator==(unsigned long, __float128) prog.cc:30:8: note: built-in candidate operator==(unsigned long, long) prog.cc:30:8: note: built-in candidate operator==(unsigned long, long long) prog.cc:30:8: note: built-in candidate operator==(unsigned long, __int128) prog.cc:30:8: note: built-in candidate operator==(unsigned long, unsigned int) prog.cc:30:8: note: built-in candidate operator==(unsigned long, unsigned long) prog.cc:30:8: note: built-in candidate operator==(unsigned long, unsigned long long) prog.cc:30:8: note: built-in candidate operator==(unsigned long, unsigned __int128) prog.cc:30:8: note: built-in candidate operator==(unsigned long long, float) prog.cc:30:8: note: built-in candidate operator==(unsigned long long, double) prog.cc:30:8: note: built-in candidate operator==(unsigned long long, long double) prog.cc:30:8: note: built-in candidate operator==(unsigned long long, __float128) prog.cc:30:8: note: built-in candidate operator==(unsigned long long, long) prog.cc:30:8: note: built-in candidate operator==(unsigned long long, long long) prog.cc:30:8: note: built-in candidate operator==(unsigned long long, __int128) prog.cc:30:8: note: built-in candidate operator==(unsigned long long, unsigned int) prog.cc:30:8: note: built-in candidate operator==(unsigned long long, unsigned long) prog.cc:30:8: note: built-in candidate operator==(unsigned long long, unsigned long long) prog.cc:30:8: note: built-in candidate operator==(unsigned long long, unsigned __int128) prog.cc:30:8: note: built-in candidate operator==(unsigned __int128, float) prog.cc:30:8: note: built-in candidate operator==(unsigned __int128, double) prog.cc:30:8: note: built-in candidate operator==(unsigned __int128, long double) prog.cc:30:8: note: built-in candidate operator==(unsigned __int128, __float128) prog.cc:30:8: note: built-in candidate operator==(unsigned __int128, long) prog.cc:30:8: note: built-in candidate operator==(unsigned __int128, long long) prog.cc:30:8: note: built-in candidate operator==(unsigned __int128, __int128) prog.cc:30:8: note: built-in candidate operator==(unsigned __int128, unsigned int) prog.cc:30:8: note: built-in candidate operator==(unsigned __int128, unsigned long) prog.cc:30:8: note: built-in candidate operator==(unsigned __int128, unsigned long long) prog.cc:30:8: note: built-in candidate operator==(unsigned __int128, unsigned __int128) 1 error generated.
fuente
Otro uso común es que los contenedores estándar realicen una comparación de igualdad en los valores clave dentro de los 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; };
fuente
operator ()
no usaoperator bool
. Son totalmente diferentes.operator ()
es el operador de llamada, por lo que aComparer
se puede llamar como una función. Esooperator ()
simplemente vuelvebool
, pero eso no lo convierte en lo mismo queoperator bool
, lo que simplemente permite un lanzamiento implícito debool
.