Puis-je cast std::vector<Animal*> std::vector<Chien*> sans regarder chaque élément?
J'ai une classe de base avec plusieurs classes de l'étendre. J'ai quelques génériques de la bibliothèque d'utilitaires qui crée un vecteur contenant des pointeurs vers la classe de base de sorte qu'aucune des sous-classes vont travailler. Comment puis je l'ai jeté tous les éléments d'un vecteur à un enfant de la classe?
//A method is called that assumes that a vector containing
//Dogs casted to Animal is passed.
void myDogCallback(vector<Animal*> &animals) {
//I want to cast all of the elements of animals to
//be dogs.
vector<Dog*> dogs = castAsDogs(animals);
}
Mon naïf solution devrait ressembler à quelque chose comme ceci:
//A method is called that assumes that a vector containing
//Dogs casted to Animal is passed.
void myDogCallback(vector<Animal*> &animals) {
//I want to cast all of the elements of animals to
//be dogs.
vector<Dog*> dogs;
vector<Animal*>::iterator iter;
for ( iter = animals.begin(); iter != animals.end(); ++iter ) {
dogs.push_back(dynamic_cast<Dog*>(*iter));
}
}
Dupliquer: stackoverflow.com/questions/902667/...
Ce n'est pas tout à fait dupe - notez qu'il n'est pas de la copie à partir
Je suppose qu'il est à la recherche pour une automatique / implicite abattu!
Hm, c'est vrai. :X
Merci pour les commentaires. 🙂 N'était pas sûr de la façon de poser et ouais, a eu un moment difficile de savoir quoi chercher!
Ce n'est pas tout à fait dupe - notez qu'il n'est pas de la copie à partir
vector<Derived*>
à vector<Base*>
, mais dans l'autre sens!Je suppose qu'il est à la recherche pour une automatique / implicite abattu!
Hm, c'est vrai. :X
Merci pour les commentaires. 🙂 N'était pas sûr de la façon de poser et ouais, a eu un moment difficile de savoir quoi chercher!
OriginalL'auteur Beau Simensen | 2009-07-24
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser
std::transform
. Il utilise toujoursfor()
en interne, mais vous aurez à deux cordes de mise en œuvre:OriginalL'auteur Kirill V. Lyadvinsky
Votre code écrit, mettre un tas de pointeurs null dans votre chiens vecteur, lorsque les animaux vecteur contient d'autres animaux de spécialisations.
OriginalL'auteur paxos1977
Il y a deux options. Le plus simple est d'utiliser quelque chose comme
remove_copy_if
. Je ne peux pas expliquer pourquoi ils l'appellent cela, mais il copie les éléments d'un récipient à un autre que ne pas satisfont le prédicat. Voici l'idée de base (non testé):}
Je suppose, une manière de regarder la
remove_copy_if
est à croire que c'estcopy_unless
.Une approche alternative, si vous basez votre code autour des itérateurs seulement, consiste à envelopper l'itérateur pour vector < Animal* > avec celui qui renvoie uniquement les chiens de la collection. Le principal avantage ici est que vous devez toujours avoir un seul conteneur, mais bien sûr, vous payez un peu plus, puisque vous êtes algorithme de naviguer sur l'ensemble de la collection d'animaux.
C'est très brouillon, mais j'espère qu'il vous montre le principe de base.
OriginalL'auteur Richard Corden
Habituellement, il n'est pas très bon à utiliser dynamic_cast pour passer. Vous devriez probablement restructurer le code de sorte que vous n'avez pas besoin d'utiliser explicitement de passer.
Voir RPC FAQ lite pour plus d'information.
UPD Aussi, voir Stroustrup page (recherche de "Pourquoi je ne peux pas attribuer un vecteur un vecteur?")
OriginalL'auteur Sad Developer
Si vous dites que vous pouvez garantir que chaque élément est vraiment un Chien puis juste
static_cast
c'est à direJ'ai l'habitude de toujours obtenir une réaction réflexe de gens que ce qui est mauvais et vous devriez toujours utiliser
dynamic_cast
mais, en réalité, si vous pouvez donner des garanties sur le type, alors il est parfaitement sûr et de l'OMI une chose sensée à faire.Aussi, votre garantie impliquerait que le nouveau vecteur a la même taille afin de réserver le même espace d'éviter de faire la répartition dans chaque
push_back
. Comme une alternative boucle, j'ai utilisé un indice juste parce que je pense toujours à une itération à l'aide d'un index doit être plus rapide que celle d'un itérateur, mais c'est sans doute absurde 🙂OriginalL'auteur Troubadour
Quand vous pouvez vous assurer que votre
std::vector<Animal*>
ne contient que desDog*
vous pouvez utiliserreinterpret_cast
.OriginalL'auteur PaulProgrammerNoob
Le mélange de la
std::transform
méthodologie avec unstatic_cast
(parce que vous êtes certains de ses sécurité) pourrait ressembler à:OriginalL'auteur Escualo