Si vous savoir à l'avance ce que toutes sortes de valeurs map
va tenir, alors utilisez boost::variant
. Ou bien, utilisez boost::any
. Avec boost::any
vous pourrez ensuite ajouter des entrées avec tout type de valeur sur la carte.
Exemple de code avec boost::variant
:
Création d'une carte :
typedef boost::variant<std::string, std::map<int, int>, int> MyVariantType;
std::map<std::string, MyVariantType> hash;
Ajout d'entrées :
hash["somedata"] = "Hello, yo, me being a simple string";
std::map<int, int> temp;
temp[6] = 5;
temp[13] = 9;
hash["somearray"] = temp;
hash["simple_data_again"] = 198792;
Récupération des valeurs :
std::string s = boost::get<std::string>(hash["somedata"]);
int i = boost::get<int>(hash["simple_data_again"]);
Comme l'a souligné @Matthieu M dans les commentaires, le type de clé de la carte peut être une boost::variant
. Cela devient possible parce que boost::variant
fournit une valeur par défaut operator<
L'implémentation fournissant les types qui la composent le font tous.
Exemple de code avec boost::any
:
Création d'une carte :
std::map<std::string, boost::any> hash;
Ajout d'entrées :
hash["somedata"] = "Hello, yo, me being a simple string";
std::map<int, int> temp;
temp[6] = 5;
temp[13] = 9;
hash["somearray"] = temp;
hash["simple_data_again"] = 198792;
Récupération des valeurs :
std::string s = boost::any_cast<std::string>(hash["somedata"]);
int i = boost::any_cast<int>(hash["simple_data_again"]);
Ainsi, avec l'aide de boost::any
le type de valeur de votre carte peut être dynamique (en quelque sorte). Le type de clé est toujours statique, et je ne connais pas de moyen de le rendre dynamique.
Un conseil :
Le C++ est un langage à typage statique. Les idiomes comme celui de votre message, qui sont utilisés assez souvent dans les langages dynamiques, ne conviennent pas bien au langage C++. Aller à l'encontre du grain d'un langage est une recette pour la douleur.
Je vous conseille donc de ne pas essayer d'émuler les idiomes de vos langages dynamiques préférés en C++. Apprenez plutôt les façons de faire du C++, et essayez de les appliquer à votre problème spécifique.
Références :