changement
std::list<Bar> & getBars()
à
std::list<Bar> getBars()
Cette volonté en retour principe en valeur, mais il y a mécanisme éludant construction de copie, afin d'optimiser les compilateurs devraient être optimiser en mesure
std::list<Bar> bars (getBars());
à ne pas impliquer le constructeur de copie et juste construire directement bars
.
De plus, en C++ 0x il y a un constructeur de déplacement, donc le code ci-dessus est efficace même si le copier/déplacer n'est pas éliminé pour une raison quelconque.
EDIT pour la question sous-classe manqué:
En général, ce n'est pas possible de le faire proprement en C++ (je suppose que Foo
est un superclasse de Bar
, sinon ce que vous faites peu de sens) . C'est probablement possible avec de la magie noire, mais je vous déconseille vivement.
approximation la plus proche est probablement ce (avec getBars()
ajusté en conséquence):
std::list <Bar*> bars (getBars());
std::list <Foo*> foos (bars.begin(), bars.end());
Cependant, ce qui impose une certaine charge de la gestion de la mémoire non trivial sur vous. L'utilisation d'un certain type de pointeurs automatiques peut aider, mais pour autant que je me souvienne, seulement shared_ptr
peut être utilisé dans des conteneurs.
Enfin, Foo
/Bar
la hiérarchie de classe devrait utiliser des fonctions virtuelles, sinon ce que vous voulez faire ne fonctionnera presque certainement pas (c.-à-d.sauf si vous voulez vraiment ignorer les remplacements dans la sous-classe).
Etes-vous sûr que cela fonctionne en Java? Parce que je viens de vérifier, et ce n'est pas parce que Java ne supporte pas les génériques covariants. De plus, cela n'aurait de sens que si 'Bar' était une sous-classe de' Foo'. –
Correct. Mon erreur. J'ai maintenant corrigé l'extrait de code. – S73417H