C++ shared_ptr opérateur d'égalité
L'opérateur d'égalité pour les shared_ptr est défini comme suit:
template<class T, class U> inline bool operator==(
shared_ptr<T> const & a, shared_ptr<U> const & b)
{
return a.get() == b.get();
}
Cela semble cassé. N'aurait-il pas été mieux de l'avant l'égalité, à ce que a et b
sont pointant vers? Ou serait-ce une injuste de restriction sur les usagers de la bibliothèque (dans ce
ils doivent fournir un opérateur d'égalité) ?
Si j'ai une carte ou un hash_table contenant shared_ptrs, puis la définition actuelle
fait de l'égalité inutilisable. Par exemple, considérons
std::map<int, std::tr1::shared_ptr<T> > m1, m2;
Ne nous voulons vérifier que le ptrs pour chaque type int en m1 et m2 sont pointant vers la même valeur ?
Je peux mettre en place mes propres égalité par l'aplatissement de m1, m2 (construction d'ensembles à partir de chaque,
un déréférencement shared_ptrs le long du chemin). Est-il un STL truc qui va effectuer cette
ou une autre façon de tester l'égalité dans la présence de shared_ptrs proprement ?
OriginalL'auteur user231536 | 2011-04-19
Vous devez vous connecter pour publier un commentaire.
Ce n'est pas rompu, car un
shared_ptr
est conceptuellement un pointeur, donc il met en œuvre pointeur-sage l'égalité. Lorsque vous testez deux pointeurs pour l'égalité, vous voulez savoir si elles pointent sur la même place en mémoire.OriginalL'auteur Fred Foo
Je pense que l'idée est que la comparaison de deux
shared_ptr
cas est à peu près aussi utile que la comparaison de deux pointeurs. Si vous voulez unstd::map
contenantshared_ptr
s ou plain old pointeurs vers des objets, vous devrez remplacer le prédicat avec quelque chose qui compare la pointe-aux objets dans les deux cas.Dans le cas de la comparaison de deux cartes, vous auriez probablement souhaitez utiliser la version de
std::equal
qui prend un prédicat.OriginalL'auteur Tim Sylvester
Juste couru dans un problème où j'ai pu utiliser les deux types d'équivalence. Un non-ordonnée ensemble de shared_ptr où je voulais l'équivalence à être basé sur le contenu de la pointe aux objets. Cela peut être mis en œuvre à l'aide d'un modèle de spécialisation de hachage et une surcharge ==. Maintenant j'ai un autre récipient qui contient ces pointeurs (un bord de l'incidence de la liste de toutes sortes), mais puisque nous savons déjà qu'ils sont uniques, car nous avons utilisé l'ensemble, nous pouvons compter sur le pointeur de l'équivalence. Bien qu'à l'origine de l'équivalence serait également le travail, il pourrait être plus efficace de compter uniquement sur le pointeur d'équivalence dans le deuxième cas, cela dépend de la quantité de données qui sont dans les instances en cours de comparaison.
Donc, pour répondre à la question. Non, il n'aurait pas été mieux, parce que la façon dont vous utilisez la flexibilité en fonction du problème à résoudre.
OriginalL'auteur jmcarter9t