Les références C ++ nous indiquent pour un STD :: map est-il possible de forcer le type de clé de ne pas être constitué?
J'ai besoin de le faire dans une méthode de modèle comme p>
4 Réponses :
Non, ce n'est pas.
C'est parce que la carte effectue sa commande interne basée sur la clé. Si vous pouviez modifier la clé vous-même, Willy-Nilly, tout l'enfer se déchaînerait. P>
Vous devez utiliser les fonctions API fournies; où l'utilisation d'un résultat dans la modification d'une valeur clé (en fait, je ne pense pas que cela ne le pense pas), la réinscription interne appropriée peut avoir lieu. P>
Pensez aux getters et à des setters et leur utilisation dans Fournir une alternative à l'accès des membres directs désordonnés / dangereux. P>
Cependant, vous pouvez écrire ceci: p> std :: map code> types alias h3>
Pour plus d'informations, Boost.MultiDex propose la méthode CODE> Mettre à jour CODE> qui permet de modifier un objet donné (en place), puis de le repositionner correctement dans tous les index. Ceci est évidemment beaucoup plus avancé que la carte STL / ONUORKEDED_MAP :)
typename T :: key_type code> vous donnera le type de clé sans ajouter de qualificatif
const code>. p>
Les réponses précédentes doivent être suffisantes pour votre question simple. Comme une approche plus générale, vous pouvez utiliser Boost :: Supprimer_Const (de Boost Type_Traits) Pour supprimer le qualificatif Const à un type.
template<class T> // T represent a map in general (std::map, boost::unordered_map or whatever..) void foo(const T& m) { typedef typename T::value_type::first_type X; //is const typedef typename boost::remove_const<X>::type NonConstX; NonConstX x; x=0; }
Le type de clé doit être constitué. Si vous êtes certain que vous ne changerez pas la commande de la carte, vous pouvez éliminer la const-ness d'itérateurs. Si vous vous trompez, cela peut entraîner cependant des bugs laids. P>
Désolé Dennis, il est tout à fait valide de le faire si vous utilisez la carte pour commander des objets instanciés par un membre de l'objet. Si vous ne changez pas ce membre, vous n'avez pas changé la commande. Un conteneur totalement immuable n'est pas un outil très utile.
Nan. Les magasins de carte paire
Cela fonctionne bien si la partie de la clé qui détermine la commande n'est pas modifiée. Vous pouvez toujours modifier d'autres membres de l'instance de l'objet clé qui ne modifie pas la commande.
C'est un comportement indéfini. Cela pourrait sembler travailler, mais cela ne le rend pas en sécurité.