8
votes

Forcer Type de clé de STD :: Plan de ne pas être Const

Les références C ++ nous indiquent pour un STD :: map xxx

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 xxx


0 commentaires

4 Réponses :


18
votes

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.

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.

Pensez aux getters et à des setters et leur utilisation dans Fournir une alternative à l'accès des membres directs désordonnés / dangereux.


Cependant, vous pouvez écrire ceci: xxx std :: map types alias xxx


1 commentaires

Pour plus d'informations, Boost.MultiDex propose la méthode Mettre à jour 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 :)



5
votes

typename T :: key_type vous donnera le type de clé sans ajouter de qualificatif const .


0 commentaires

4
votes

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; 
}


0 commentaires

0
votes

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.


4 commentaires

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 Objets. Notez que la clé est stockée dans un objet Const. Modification d'un objet Const, peu importe pourquoi il est utilisé ailleurs, est un comportement indéfini. Si le membre est mutable et que cela n'effectue pas la commande, vous serez peut-être bien, mais c'est un événement assez rare.


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é.