Per esempio:Qual è il significato di "const bool operator()"
operator bool() const
{
return col != 0;
}
col
è un int. Come funziona operator bool() const
?
Per esempio:Qual è il significato di "const bool operator()"
operator bool() const
{
return col != 0;
}
col
è un int. Come funziona operator bool() const
?
funzioni membro della forma
operator TypeName()
sono operatori di conversione. Consentono agli oggetti del tipo di classe di essere utilizzati come se fossero di tipo TypeName
e, quando lo sono, vengono convertiti in TypeName
utilizzando la funzione di conversione.
In questo caso particolare, operator bool()
consente di utilizzare un oggetto del tipo di classe come se fosse un bool
. Ad esempio, se si dispone di un oggetto di tipo classe denominata obj
, è possibile utilizzarlo come
if (obj)
Ciò chiamerà il operator bool()
, restituire il risultato, e utilizzare il risultato come la condizione del if
.
Va notato che operator bool()
è una pessima idea e non dovresti mai usarlo. Per una spiegazione dettagliata del perché è sbagliato e per la soluzione del problema, vedere "The Safe Bool Idiom."
(C++ 0x, la prossima revisione dello standard C++, aggiunge il supporto per operatori di conversione espliciti. scrivere una cassaforte explicit operator bool()
che funziona correttamente senza dover passare attraverso i cerchi di implementazione di Safe Bool Idiom.)
È una conversione implicita in bool
. Cioè laddove sono consentite conversioni implicite, la classe può essere convertita in bool
chiamando tale metodo.
È la funzione di conversione definita dall'utente implicit
per convertire la classe in true
o false
.
//usage
bool value = yourclassinstance; //yourclassinstance is converted into bool!
Come gli altri hanno già detto, è per la conversione del tipo, in questo caso a bool
. Per esempio:
class A {
bool isItSafe;
public:
operator bool() const
{
return isItSafe;
}
...
};
Ora posso usare un oggetto di questa classe come se fosse un valore booleano:
A a;
...
if (a) {
....
}
operator bool() const
{
return col != 0;
}
Definisce come la classe è convertibile in un valore booleano, la const
dopo la ()
viene utilizzato per indicare che questo metodo non si modifica (modifica i membri di questa classe).
Si potrebbe solito utilizzare tali operatori come segue:
airplaysdk sdkInstance;
if (sdkInstance) {
std::cout << "Instance is active" << std::endl;
} else {
std::cout << "Instance is in-active error!" << std::endl;
}
Un altro uso comune è per contenitori std da fare confronto di uguaglianza su valori chiave all'interno oggetti personalizzati
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;
};
Questo è un esempio usa 'operator()' not 'operator bool'. Sono totalmente diversi. 'operator()' è l'operatore di chiamata, in modo che un 'Comparer' possa essere chiamato come una funzione. Quel 'operatore()' semplicemente restituisce 'bool', ma questo non lo rende lo stesso di' operator bool', che consente semplicemente un cast implicito a 'bool'. – anthropomorphic
Mi piacerebbe dare più codici per chiarire
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
}
+1 per riferimento alla sicurezza Bool Idiom – greyfade
"usato come se fosse un bool" implica falsamente si potrebbe, ad esempio, assegnare un valore booleano. Piuttosto, nel codice del poster, genera una variabile temporanea di tipo bool che si riferisce al valore momentaneo di col, ma è successivamente indipendente dall'oggetto che lo ha creato. Inoltre, la menzione di Safe Bool Idiom è ottima, ma solo per registrare che esistono visioni contrarie: IMHO il consiglio "mai veramente usarlo" è esagerato - fornisce controlli del compilatore più rigidi contro l'uso improprio a costo di un'API più offuscata ciò può portare ad un uso improprio accidentale. –
@ Tony: beh, può essere usato come se fosse un bool; poiché il risultato della conversione è un valore rvalue ('bool'), no, non puoi assegnarlo. Se fosse un lvalue modificabile (ad esempio 'bool &'), allora potresti assegnarlo. Per quanto riguarda la correttezza, sostengo che un 'operator bool()' è sempre errato perché consente l'uso di un oggetto di tipo classe in un numero enorme di situazioni in cui non si desidera utilizzarlo. Safe Bool è un'alternativa di gran lunga superiore. –