2011-10-27 10 views
9

Ho una funzione che deve restituire NULL in alcuni casi e c'è un'altra funzione che deve verificare il valore restituito da questa funzione. Sono consapevole di boost :: opzionale ma non sono sicuro di come usare la sintassi.Come utilizzare boost :: opzionale <T> per restituire NULL in C++?

seguito sarebbe stato un semplice esempio di utilizzo detto:

int funct1(const string& key) { 
    // use iterator to look for key in a map 
    if(iterator == map.end()) { 
    return NULL // need help here! 
    else 
    return it->second; 
} 

void funct2(string key) { 
    if(funct1(key) == NULL) { // <-- need help here! 
    // do something 
    } else { 
    // do something else 
    } 

Qualcuno può aiutare con la sintassi?

Grazie.

+9

Hai posto 10 domande e accettato 0 risposte. Dovresti tornare indietro e accettare le risposte corrette. –

risposta

14

Rimane nello stato "NULL" finché non lo si imposta. È possibile utilizzare questo linguaggio:

optional<int> funct1(const string& key) { 
    // use iterator to look for key in a map 
    optional<int> ret; 
    if (iterator != map.end()) 
    { 
    ret = it->second; 
    } 

    return ret; 
} 

Poi:

if (!funct1(key)) { /* no value */ } 
1

Prova questo:

int funct1(const string& key) 
{ 
    // use iterator to look for key in a map 
    if(iterator == map.end()) 
    return boost::optional<int>(); 
    else 
    return boost::optional<int>(it->second); 
} 

void funct2(string key) 
{ 
    const boost::optional<int> result = funct1(key); 
    if (result.is_initialized()) 
    { 
    // Value exists (use result.get() to access it) 
    } 
    else 
    { 
    // Value doesn't exist 
    } 
} 

Vorrei anche typedef il modello, per rendere le cose più facili:

typedef boost::optional<int> OptionalInt; 
+5

La documentazione di Boost.Optional dice che 'is_initialized' è deprecato; usa invece l'operatore di conversione 'bool' (ad esempio' if (result) {...} '). Inoltre, il tuo tipo di ritorno 'funct1' non dovrebbe essere' int'. – ildjarn

3

Lasciami menzionare alcune cose prima di arrivare al qu estion.

Se la stringa deve sempre essere trovata (errore del programmatore se non lo è) probabilmente si dovrebbe lanciare se non può essere invece di utilizzare un opzionale. Potresti anche voler provare/prendere/lanciare anche se è l'input dell'utente.

Se la classe imita il contenitore come semantica, è consigliabile utilizzare una sentinella end per indicare che non è stata trovata, non è null.

Se tuttavia restituire una rappresentazione nullo è ciò che si sta cercando, il tipo restituito dalla funzione sarà boost::optional<int> e il reso nullo sarà return boost::none;.

+1

Ciao Mark B. - Perché raccomandi di restituire boost :: none mentre gli altri preferiscono semplicemente restituire l'opzionale stesso? C'è una differenza? Se c'è, quale è il preferito in un'impostazione di codice professionale? Il mio codice è inteso come una libreria che altri utenti possono usare, quindi provare/prendere/lanciare essere più preferito nel codice che si basa fortemente sull'input dell'utente? Grazie. – czchlong

+0

Vorrei anche usare 'boost :: none', perché aumenta la leggibilità (secondo me). –

Problemi correlati