C++ carte avec différents types de données en tant que valeurs
mon problème est le suivant: je veux mettre les deux (pas plus) les différents types de données en tant que valeurs sur une carte.
typeX A, B, ...;
typeY Z, Y, ...;
void func (typeX) { ... }
void func (typeY) { ... }
std::map <std::string, what_to_put_here?? >map;
map["a"] = A;
map["z"] = Z;
...
std::vector<std::string> list;
//this list will be sth. like "a", "y", ...
for (unsigned int i = 0; i < list.size(); ++i)
func( map[list[i]] )
Évidemment, cela ne fonctionne pas comme la carte ne pourra accepter qu'un type de données de valeur. Si la boucle sur la "liste", l'appel à "func" doit être sans équivoque puisque le type de carte[liste[i]] est connue.
Je veux éviter explicite du moulage ou de la vérification de type, c'est à dire qqch comme
if (typeid( map[list[i]] ).name() == "typeX")
func( map[list[i]] )
else if (typeid( map[list[i]] ).name() == "typeY")
func( map[list[i]] )
Pouvez-vous me dire si cela est possible? Encore une fois, elle sera limitée à seulement deux types de données différents. Merci!
Je voudrais faire une classe wrapper avec deux variables de membre et de l'utiliser dans la carte de la déclaration.
boost::variant pourrait aider.
Avez-vous envisagé de faire
boost::variant pourrait aider.
Avez-vous envisagé de faire
typeX
et typeY
sous-classes d'une classe de base commune?OriginalL'auteur user3240855 | 2014-01-27
Vous devez vous connecter pour publier un commentaire.
Vous souhaitez utiliser
boost::variant
:Vous devez explicitement extrait de l'objet à son type correct avant de pouvoir appeler
func
OriginalL'auteur Paul Evans
Sont typeX et typeY sous-classes d'une typeBase classe ?
Si oui, vous pourriez faire un
std::map<std::string,typeBase*>
pour stocker à la fois typeX* et typeY* dans la carte.OriginalL'auteur rom1504
Avec certains métaprogrammation vous pouvez facilement construire un caractère hétérogène de la carte qui peut stocker n'importe quel type à partir d'un ensemble de types. Voici un exemple qui le fait, sans le type d'effacement, ni la nécessité de visiter les valeurs.
OriginalL'auteur Julien
Une façon de mettre en œuvre un multi-type de carte est d'utiliser les fonctionnalités intéressantes de std::tuple en C++11, qui permet d'accéder par un type de clé. Vous pouvez envelopper ce afin de créer un accès par clés arbitraires. Une explication en profondeur de ce (et très intéressant de lire) est disponible ici:
https://jguegant.github.io/blogs/tech/thread-safe-multi-type-map.html
OriginalL'auteur johnbakers
Ce serait sans doute une extrême excessive, mais QT a une variable appelée QVariant qui peut être utilisé pour cartographier les différents types de (QT) variables.
Documentation ici: http://qt-project.org/doc/qt-5.0/qtcore/qvariant.html
OriginalL'auteur Snowman6286
Vous avez besoin d'un type d'effacement.
Type d'effacement est un modèle qui cache le type sous-jacent, tels exemples les plus connus sont boost::any, mais gardez à l'esprit que stimuler les dynamiques comportement polymorphique (répartition dynamique à l'exécution). boost::variant sur l'autre main est un autre exemple et utilise le modèle de la métaprogrammation techniques. voir variante vs tous
La solution la plus simple si, pourrait être d'écrire votre propre type de classe d'effacement avec un enum pour le type sous-jacent.
OriginalL'auteur concept3d