2010-02-05 16 views
9

Supponiamo che io ho questa classe:operatore condizionale nella lista dei membri-inizializzazione

class foo 
{ 
public: 
    foo() { } 
    foo(const std::string& s) : _s(s) { } 

private: 
    std::string _s; 
}; 

che è membro di un'altra classe:

class bar 
{ 
public: 
    bar(bool condition) : 
     _f(condition ? "go to string constructor" : **go to empty ctor**) 
    { 
    } 

private: 
    foo _f; 
}; 

Quando si inizializza _f in bar s' elenco di inizializzazione membro vorrei piace scegliere quale costruttore di foo invocare in base a condition.

Cosa posso inserire invece di go to empty ctor per fare in modo che funzioni? Ho pensato di mettere foo(), c'è un altro modo?

risposta

14

Il risultato di un operatore condizionale è sempre un tipo fisso determinato al momento della compilazione individuando un tipo comune in cui entrambe le opzioni possono essere convertite. (Le regole esatte sono un po 'coinvolte, ma nell'uso comune di solito "fa la cosa giusta".)

Nel tuo esempio la cosa più semplice da fare è lasciare che quel tipo sia temporaneo foo e quindi usare il costruttore di copie per intializzare _f nella barra.

È possibile eseguire questa operazione come segue.

_f(condition ? foo("string") : foo()) 
+1

Con C++ 11, consiglierei un costruttore di movimento su un costruttore di copie, ma la tecnica è buona. – Richard

+1

@Richard: non stavo raccomandando un uso esplicito del costruttore di copie (non che ciò sia possibile a mia conoscenza). L'esempio che ho mostrato userà un costruttore di mosse quando appropriato. –

0

Se passando una stringa vuota è l'equivalente di chiamare al costruttore no-arg è possibile effettuare le seguenti operazioni:

_f(condition ? "string" : "") 

In questo modo si sarebbe salvare la copia.

Problemi correlati