C++

2013-05-08 8 views
10

E 'possibile modificare il comportamento di if() in modo che:C++

class Foo { 
    int x; 
}; 

Foo foo; 
if(foo) 

procede solo se il valore di x è qualcosa di diverso da zero? oppure ...

Sarebbe una conversione di tipo definita dall'utente su int work/sarebbe un approccio appropriato? oppure ...

È meglio fare qualcosa come if(foo.getX())?

+4

Se avete bisogno di questo in un contesto in C++ 03, si potrebbe desiderare di esaminare la bool linguaggio sicura: http://www.artima.com/cppsource/safebool .html – Yuushi

risposta

22

È possibile convertire l'oggetto per un valore booleano definendo operator bool():

explicit operator bool() const 
{ 
    return foo.getX(); 
} 

Il explicit parola chiave impedisce conversioni implicite da Foo a bool. Ad esempio, se si inserisce accidentalmente foo in un'espressione aritmetica come foo + 1, il compilatore potrebbe rilevare questo errore se si dichiara come explicit, altrimenti foo verrà convertito in bool anche se non previsto.

In generale, funzioni membro della forma

operator TypeName() 

(con opzionale explicit e const qualificazione) sono operatori di conversione. Ti consente di trasmettere la tua classe a qualsiasi tipo specificato da TypeName. Nella direzione opposta, i costruttori con un argomento consentono di lanciare qualsiasi tipo alla classe:

class Foo { 
    Foo(int x); // convert int to Foo 
    operator bool() const; // convert Foo to bool 
    int x; 
}; 

Questo definisce le conversioni implicite per la vostra classe. Il compilatore tenta di applicare queste conversioni, se possibile (come quello che fa per i tipi di dati incorporati, ad esempio 5 + 1.0). Puoi dichiararli come explicit per sopprimere le conversioni implicite indesiderate.

+7

Rendere esplicito è probabilmente meglio. – chris

+1

Si ** sicuramente ** si desidera contrassegnare questo esplicito a meno che non si desideri consentire alle persone di fare cose come '! MyClass'. – templatetypedef

11

È possibile definire un operatore per convertire l'oggetto di bool

class Foo 
{ 
    int x; 
public: 
    operator bool() const 
    { 
    return x > 0; 
    } 
}; 

ma questo può avere conseguenze impreviste a causa di conversioni implicite per bool quando non si desidera la conversione di prendere posto. Per esempio

int x = 42 + Foo(); 

C++ 11 risolve questo problema permettendo di dichiarare l'operatore di conversione come explicit, che poi consente solo le conversioni implicite in determinati contesti, come all'interno di if economico.

explicit operator bool() const // allowed in C++11 

Ora

int x = 42 + Foo(); // error, no implicit conversion to bool 
int x = 42 + static_cast<bool>(Foo()); // OK, explicit conversion is allowed