2010-02-05 3 views
9

Supposons que j'ai cette classe:Opérateur conditionnel dans la liste-initialisation des membres

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

private: 
    std::string _s; 
}; 

Ce qui est membre d'une autre classe:

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

private: 
    foo _f; 
}; 

Lors de l'initialisation _f dans la liste d'initialisation de membre de bar Je voudrais aime choisir quel constructeur de foo pour invoquer basé sur condition.

Que puis-je mettre au lieu de go to empty ctor pour que cela fonctionne? J'ai pensé à mettre foo(), y a-t-il un autre moyen?

Répondre

14

Le résultat d'un opérateur conditionnel est toujours un type fixe déterminé au moment de la compilation en recherchant un type commun auquel les deux options peuvent être converties. (Les règles exactes sont un peu impliquées, mais dans l'usage commun il fait habituellement la bonne chose.)

Dans votre exemple, la chose la plus simple à faire est de laisser ce type être un foo temporaire, puis d'utiliser le constructeur de copie pour initialiser _f en barre.

Vous pouvez procéder comme suit.

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

Avec C++ 11, je recommanderais un constructeur de mouvement sur un constructeur de copie, mais la technique est bonne. – Richard

+1

@Richard: Je ne recommandais pas une utilisation explicite du constructeur de copie (pas que ce soit possible à ma connaissance). L'exemple que j'ai montré utilisera un constructeur de déplacement, le cas échéant. –

0

Si passer une chaîne vide est l'équivalent d'appeler à ne-arg constructeur, vous pouvez effectuer les opérations suivantes:

_f(condition ? "string" : "") 

Cela vous sauver la copie.

Questions connexes