Je suis assez sûr qu'il n'y a aucun moyen de le faire explicitement mais je voudrais demander sans faute au cas où il y aurait un meilleur moyen. J'ai une classe de base A et une classe B dérivée, maintenant j'ai une liste std :: de A * qui pointe vers B * et je veux copier cette liste de A * dans un std :: vector de B * est donc en gros je veux faire ceci:C++ std :: copie avec le type cast en classe dérivée possible?
std::list<A*> aList = someObject.getAs();
std::vector<B*> bVec = std::vector<B*>(aList.begin(), aList.end());
Je suis assez sûr que cela devrait compiler lorsque la liste et le vecteur seraient du même type (par exemple, les deux étaient A * 's), mais étant donné que dans ce cas A * est la classe de base de B * Je ne peux pas le faire de cette façon, parce que je dois explicitement cataloguée par exemple comme ceci:
std::list<A*> aList = someObject.getAs();
std::vector<B*> bVec;
bVec.reserve(aList.size());
std::list<A*>::iterator it = aList.begin();
for(it; it!=aList.end(); ++it)
{
B* b = static_cast<B*>(*it);
bVec.push_back(b);
}
est-il un moyen plus élégant que ma deuxième approche ou sera Je dois le faire comme ça?
A cet effet, dynamic_cast est plus sûr que static_cast. static_cast vous donnera un B * même si ce n'est pas un B *, alors que dynamic_cast vous donnera un pointeur nul. Dans les deux cas, si le A * ne pointe pas vers un B, vous obtenez un comportement indéfini si vous le traitez comme un B, mais dans la version dynamic_cast vous pouvez au moins dire si ce n'est pas un B. –
@David Thornley : ... tant que 'A' a au moins une fonction virtuelle. –
@Charles: Merci - bonne prise. –