Comment le mauvais est à utiliser void pointeur dans std::vector déclaration?
J'ai deux classes différentes, comme ci-dessous:
class text
{ };
class element
{ };
Et je veux les stocker dans le class node
:
template <typename T>
class node
{
T cargo;
std::vector<void*> children;
node(T cargo) : cargo(cargo)
{ };
void add_child(T node)
{
this->children.push_back((void*) node);
}
}
Je voudrais donc appeler le nœud de cette façon, le stockage, text
et element
's:
element div;
text msg;
node<element> wrapper(div);
wrapper.add_child(msg);
MODIFIER: Pour récupérer le contenu-je utiliser T typedef type;
et convertir vide pointeur vers (type*)
.
Je sais que c'est pas très élégant ni fonctionnels, mais je ne peux pas comprendre ce qui est la façon correcte de le faire. Alors merci de me dire si cela est pratiquement acceptable et si elle n'est pas, comment le faire de manière appropriée.
Merci d'avance!
- Que diriez-vous, tu sais... une classe de base?
- La remarque ci-dessus: à moins que T est une primitive ou de type pointeur, il est peu probable qu'elle s'adapte à la taille d'un void*. Vous pourriez vouloir: add_child(T* node) ... push_back((void*)nœud); au lieu de cela.
Vous devez vous connecter pour publier un commentaire.
Cheers & hth.,
PS: Erreur de vérification, de gestion de durée de vie, l'itération etc. omis dans cet exemple de code.
boost::any
est un exemple de type d'effacement. Vous avez connu une interface étroite à quelque chose, et derrière que vous rentrez un objet de presque n'importe quel type, sorte de câblage dans la colle par le biais de certains de template (génération de code qui fait un peu de coulée). Cheers,dynamic_cast<>ing
le seul moyen d'obtenir des informations de retour dans ce cas?Définir une base commune de classe pour
element
ettext
et puisadd_child
peut prendre un pointeur vers la classe de base, et le vecteur peut stocker des pointeurs vers la classe de base.Comment voulez-vous récupérer si vous faites cela? À partir d'un
void*
il n'y a aucun moyen de déterminer ce qui est réellement stocké sur l'adresse.Edit:
Si vous êtes toujours en faire un moulage en
T*
alors vous pouvez simplement prendreT*
en tant que paramètre.node
's enfants vecteur doit être capable de stockerelement
s ettext
. Ma classe de conteneur est de garder registre des types sont ajoutés, puis les utilise pour restaurer les valeurs.T
comme un paramètre de laadd_child()
méthode.Si votre conteneur valeur est limitée à un petit nombre de types, vous pouvez obtenir ce à l'aide de
boost::variant
comme indiqué ici:J'ai pris la liberté de proposer un couple de d'autres mods - utilisation
const
de référence au lieu de passer par valeur surnode
constructeur etadd_child
; le récipientchildren
statique, comme je ne pense pas que cela a du sens pour chaquenode<T>
d'avoir son propre conteneur. Verrouillage serait nécessaire pour multithread utilisation deadd_child
dans ce cas. Ces commentaires s'appliquent à savoir si vous pouvez utiliser Boost ou pas dans votre solution finale.Vous pouvez effectuer des opérations sur les
vector
éléments en utilisant soitget
oustatic_visitor
, ce dernier est préférable, car vous pouvez faire de ce générique, comme le montre ici. Un exemple devector
itération analogue à ce que vous pouvez utiliser pour cette solution:De sortie est:
Tout d'abord, il n'y a pas une telle chose comme "mauvais" pour utiliser un pointeur void. Oubliez toutes les conventions et bla-blas, et faire ce qui est le plus approprié pour votre cas.
Maintenant, en vous cas précis, si il n'y a aucun lien entre ces deux catégories, vous pouvez déclarer une classe de base, de sorte que ces deux-là vont en hériter. Ensuite, vous pouvez déclarer le vecteur d'un pointeur de classe de base.
node
être elle-même la classe de base pourelement
snatext
? Pourriez-vous, s'il vous plaît, montrez un rapide exemple de code?