Question

J'ai besoin de stocker une série de points de mesure dans la forme de (nom, valeur), où la valeur peut prendre différents types.

Je suis en train d'utiliser un modèle de classe pour chacun des points de données.Ensuite, pour chaque point que je vois, je veux créer un nouvel objet et de le pousser à nouveau dans un vecteur.Pour chaque type nouveau, j'ai besoin de créer une nouvelle classe à partir du modèle de la première.Mais je ne peux pas stocker les objets créés dans un vecteur, depuis les vecteurs de s'attendre au même type pour toutes les entrées.Les types j'ai besoin de magasin ne peut pas être installé dans une hiérarchie d'héritage.Ils ne sont pas liés.Il peut aussi y avoir d'autres types créés à l'avenir, et je ne veux pas modifier le service de stockage pour chaque type nouveau.Est-il un moyen de créer un groupe hétérogène de conteneur pour stocker ces entrées?Merci!!!!

Était-ce utile?

La solution

La bibliothèque de Boost a probablement ce que vous recherchez (boost :: n'importe quel).Vous pouvez rouler votre propre à l'aide d'une approche de pointeur enveloppée si vous ne pouvez pas utiliser Boost ...

Autres conseils

boost::any a déjà été recommandé, cependant, c'est pour quoi que ce soit, de sorte que vous ne pouvez pas vous attendre beaucoup de lui.

Si vous connaissez les différents types de l'avance, vous êtes mieux à l'aide d' boost::variant.

typedef boost::variant<Foo, Bar, Joe> variant_type;

struct Print: boost::static_visitor<>
{
  void operator()(Foo const& f) const { f.print(std::cout); }

  template <class T>
  void operator()(T const& t) const { std::cout << t << '\n'; }
};

void func(variant_type const& v) // not template
{
  boost::apply_visitor(Print(), v); // compile-time checking
                                    // that all types are handled
}

Le problème avec des conteneurs comme celui-ci est que lorsque vous souhaitez accéder à quelque chose dans le conteneur, vous devez déterminer son type, puis le jeter au type réel.Ceci est laide, inefficace et surmontée, c'est pourquoi le choix n ° 1 en C ++ est d'utiliser l'héritage, à moins que vous n'ayez une très bonne raison de ne pas - quelque chose que je n'ai jamais rencontré dans ma carrière C ++.

Je pensais que vous pouviez simplement avoir une paire (type, vide *) et écrire votre propre fonction POP qui jette le vide * en fonction du type décrit dans la paire, puis de la pousser dans tout ce récipient attrape votre œil.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top