Par exemple:
operator bool() const
{
return col != 0;
}
col
est un int. Comment ça operator bool() const
marche?
Par exemple:
operator bool() const
{
return col != 0;
}
col
est un int. Comment ça operator bool() const
marche?
Fonctions des membres du formulaire
operator TypeName()
sont des opérateurs de conversion. Ils permettent aux objets de type classe d'être utilisés comme s'ils étaient de type TypeName
et lorsqu'ils le sont, ils sont convertis en TypeName
utilisant la fonction de conversion.
Dans ce cas particulier, operator bool()
permet d'utiliser un objet de type classe comme s'il s'agissait d'un bool
. Par exemple, si vous avez un objet du type de classe nommé obj
, vous pouvez l'utiliser comme
if (obj)
Cela appellera le operator bool()
, retournera le résultat et utilisera le résultat comme condition du if
.
Il convient de noter que operator bool()
c'est une très mauvaise idée et que vous ne devriez vraiment jamais l'utiliser. Pour une explication détaillée des raisons pour lesquelles il est mauvais et pour la solution au problème, consultez «L'idiome Safe Bool».
(C ++ 0x, la prochaine révision de la norme C ++, ajoute la prise en charge des opérateurs de conversion explicites. Ceux-ci vous permettront d'écrire un coffre explicit operator bool()
- fort qui fonctionne correctement sans avoir à sauter à travers les obstacles de l'implémentation de Safe Bool Idiom.)
bool
), non, vous ne pouvez pas lui attribuer. S'il s'agissait d'une lvalue modifiable (par exemplebool&
), vous pourriez lui assigner. En ce qui concerne l'exactitude, je soutiens que anoperator bool()
est toujours incorrect car il permet l'utilisation d'un objet de type classe dans un grand nombre de situations où vous ne voulez jamais qu'il soit utilisé. Safe Bool est une alternative bien supérieure.explicit operator bool()
. Est-ce que je comprends bien?operator bool() const { return col != 0; }
Définit comment la classe peut être convertie en valeur booléenne,
const
après le()
est utilisé pour indiquer que cette méthode ne mute pas (changez les membres de cette classe).Vous utiliserez généralement ces opérateurs comme suit:
airplaysdk sdkInstance; if (sdkInstance) { std::cout << "Instance is active" << std::endl; } else { std::cout << "Instance is in-active error!" << std::endl; }
la source
Je voudrais donner plus de codes pour que ce soit clair.
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 }
la source
C'est
implicit
une fonction de conversion définie par l'utilisateur pour convertir votre classe en soittrue
oufalse
.//usage bool value = yourclassinstance; //yourclassinstance is converted into bool!
la source
C'est une conversion implicite en
bool
. Autrement dit, partout où les conversions implicites sont autorisées, votre classe peut être convertiebool
en appelant cette méthode.la source
Comme les autres l'ont dit, c'est pour la conversion de type, dans ce cas en a
bool
. Par exemple:class A { bool isItSafe; public: operator bool() const { return isItSafe; } ... };
Maintenant, je peux utiliser un objet de cette classe comme s'il s'agissait d'un booléen:
A a; ... if (a) { .... }
la source
En écrivant mon propre unique_ptr, j'ai trouvé ce cas. Compte tenu de
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;
Et ce cas de test de libstdcxx :
std::unique_ptr<int> ptr; if (ptr == 0) { } if (0 == ptr) { } if (ptr != 0) { } if (0 != ptr) { }
Notez parce que cela
ptr
a unexplicit operator bool() const noexcept;
, doncoperator overload resolution
fonctionne bien ici, par exemple,ptr == 0
choisittemplate <class T, class D> bool operator==(const unique_ptr<T, D>& x, nullptr_t) noexcept;`.
S'il n'y a pas de
explicit
mot-clé ici,ptr
inptr == 0
sera converti enbool
, puisbool
sera converti enint
, carbool operator==(int, int)
est intégré et0
estint
. Ce qui nous attend, c'est une erreur de résolution de surcharge ambiguë.Voici un exemple minimal, complet et vérifiable :
#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 | ^~~~~~~~
clang :
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.
la source
Une autre utilisation courante est que les conteneurs std effectuent une comparaison d'égalité sur les valeurs clés à l'intérieur des objets personnalisés
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; };
la source
operator ()
pasoperator bool
. Ils sont totalement différents.operator ()
est l'opérateur d'appel, de sorte que aComparer
peut être appelé en tant que fonction. Celaoperator ()
arrive juste à revenirbool
, mais cela ne le rend pas identique àoperator bool
, ce qui permet simplement un cast implicite versbool
.