Question

J'écris une table de hachage pour ma classe de structures de données et j'aimerais ajouter un petit sucre syntaxique à mon implémentation.

template <typename HashedObj, typename Object>
Object & Dictionary<HashedObj, Object>::operator[](HashedObj & key)
{
  return items.lookup(key);
}

Cela fonctionne bien lorsque je fais quelque chose comme cout < < dict [& "; ma clé &";). Mais comment puis-je effectuer une affectation avec les crochets? Quelque chose comme:

dict["mykey"] = "something";

Et non, cela ne fait pas partie de mes devoirs (sans jeu de mots), je veux juste apprendre le C ++ un peu mieux.

Était-ce utile?

La solution

On ne sait pas exactement ce que vous demandez ici. Le code que vous avez présenté prend déjà en charge l’affectation. Il suffit de le faire et de travailler à volonté (ou du moins il devrait compiler). Cela ne fait aucune différence du côté de l'opérateur d'affectation sur lequel votre [] surchargé est utilisé. Cela fonctionnera exactement de la même façon sur le côté gauche (LHS) que sur le côté droit (RHS) de la mission (ou en tant qu'opérande de <<, comme dans votre message d'origine). Votre Object retourne une référence à un lookup, puis l'affectation réelle est gérée par l'opérateur d'affectation de votre type NULL, ce qui signifie que le std::map lui-même n'est pas réellement impliqué dans l'affectation réelle.

La vraie question est de savoir comment vous voulez que votre const HashedObj& agisse dans certains cas particuliers. Que se passera-t-il si votre clé n'est pas présente dans le tableau? Référence à ce que HashedObj votre <=> va-t-il retourner dans ce cas?

Il est impossible de comprendre ce que vous avez posté. Je vois que cela retourne une référence, donc retourner <=> est hors de question. Insère-t-il un nouveau <=> vide pour la clé donnée? Si c'est le cas, vous ne devez rien faire. Votre <=> est déjà parfaitement prêt à être utilisé sur le LHS de l’assignation. (C’est ainsi que <=> dans <=> fonctionne, BTW)

Au cas où votre <=> retourne une référence à un "ient spécial " <=>, vous devez prendre des mesures spéciales. Vous ne voulez probablement pas assigner quoi que ce soit à un & Quot; guard & Quot; objet, il faut donc & "désactiver &"; son opérateur d'assignation en quelque sorte et vous avez terminé. Le reste devrait fonctionner tel quel.

Si votre <=> lève une exception en cas de clé inexistante, vous devez décider si c'est ce que vous voulez lorsque le <=> est utilisé sur le LHS d'une affectation. Si c'est le cas, vous n'avez rien à faire. Sinon, cela demandera du travail supplémentaire ...

Encore une fois, que se passe-t-il si vous passez une clé non existante à <=>?

P.S. De plus, il serait normalement plus judicieux de déclarer le <=> (et <=>) avec le paramètre <=> ou uniquement le paramètre <=>. Les références non constantes, comme dans votre exemple, semblent étranges et peuvent entraîner des problèmes dans certains cas (voire dans la plupart des cas). Je suis surpris que cela fonctionne pour vous maintenant ...

Autres conseils

Vous devez surcharger cela 2 fois. Une qui sera const, qui sera la data access partie et une autre qui retournera une référence, qui agira comme un & "; Setter &";.

Ce que vous recherchez, ce sont des fonctionnalités similaires à celles de l'opérateur de crochet surchargé dans std::map. Dans std::map<K,V> mymap l'opérateur crochet effectue une recherche et renvoie une référence à un objet associé à une clé particulière. Si la carte ne contient aucun objet associé à la clé, l'opérateur insère un nouvel objet dans la carte à l'aide du constructeur par défaut.

Ainsi, si vous avez mymap[someKey], appeler someKey renverra une référence à la valeur associée à V ou créera un nouvel objet de type V() en appelant <=> ( le constructeur par défaut de V), puis renvoie une référence à ce nouvel objet, ce qui permet à l'appelant d'attribuer une valeur à l'objet.

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