2010-02-05 13 views
9

Supongamos que tengo esta clase:operador condicional en la lista de miembros-inicialización

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

private: 
    std::string _s; 
}; 

que es un miembro de otra clase:

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

private: 
    foo _f; 
}; 

Al inicializar _f en bar 's lista de inicialización miembro que lo haría gustaría elegir qué constructor de foo para invocar basa en condition.

Qué puedo poner en lugar de go to empty ctor para hacer este trabajo? Pensé en poner foo(), ¿hay otra manera?

Respuesta

14

El resultado de un operador condicional es siempre un tipo fijo determinado en tiempo de compilación al encontrar un tipo común al que se pueden convertir ambas opciones. (Las reglas exactas son un poco complicadas, pero en el uso común generalmente 'hace lo correcto'.)

En su ejemplo, lo más simple es dejar que ese tipo sea temporal foo y luego usar el constructor de copias para inicializar _f en la barra.

Puede hacerlo de la siguiente manera.

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

Con C++ 11, recomendaría un move-constructor sobre un copy-constructor, pero la técnica es buena. – Richard

+1

@Richard: No estaba recomendando un uso explícito del constructor de copia (no es posible que eso sea posible). El ejemplo que mostré usará un constructor de movimiento cuando sea apropiado. –

0

Si pasa una cadena vacía es el equivalente a llamar al constructor sin argumentos que podría hacer lo siguiente:

_f(condition ? "string" : "") 

Esto le ahorraría la copia.

Cuestiones relacionadas