2010-09-03 2 views
2

Je souhaite mapper un pointeur sur un nombre entier à des fins de sérialisation. Les pointeurs peuvent être de types différents et peuvent pointer vers des objets polymorphes en utilisant éventuellement l'héritage multiple. J'ai besoin d'interroger la carte pour savoir si le pointeur est stocké dedans et si c'est le cas, alors quelle est la valeur intégrale associée.Pointeur efficace vers le mappage d'entiers et la recherche en C++

Quelle est la bonne façon de le faire?

La manière simple de map<void*, int> que je pensais ne fonctionnerait pas car operator < n'est pas défini pour les pointeurs arbitraires. Ou est-ce pas un problème sur les systèmes communs? Une autre solution serait d'avoir vector<void*>. Mais cela nécessiterait de faire une boucle sur tous les pointeurs stockés et je ne suis pas sûr que la conversion en void * ne rompe pas le operator == pour les objets utilisant l'héritage.

+0

"que je pensais ne fonctionnerait pas parce que l'opérateur Chubsdad

+0

Avez-vous envisagé d'utiliser une bibliothèque? Exemples: s11.net ou boost.serialization –

+0

Oui, j'ai envisagé d'utiliser boost :: serialization, mais cela nécessiterait quelques ajustements pour être utilisable sur mes données. –

Répondre

6

Vous avez de la chance avec votre idée initiale d'utiliser map<void*, int>.
Bien que vous ayez raison que operator< n'est pas défini pour les pointeurs, le prédicat utilisé par std::map<> est std::less<> et la norme C++ requiert que std::less<T*> fonctionne également pour les pointeurs arbitraires.

Citation de la norme C du à l'appui de cette ([lib.comparisons]/8):

Pour les modèles greater, less, greater_equal et less_equal, les spécialisations pour tout rendement de type pointeur, un ordre total, même si les opérateurs intégrés <, >, <=, >= ne le font pas.

+0

Je doute de ceci: Toute référence pour cela – Chubsdad

+0

Mis à jour ma réponse avec une citation de soutien. –

+0

+1 Bon à savoir –

0

vous pouvez simplement faire une carte de int32/64 non signé à int (en fonction de x86 ou x64). Jetez juste le vide * à l'int non signé et il fera heureusement la comparaison.

+0

Ok, je peux lancer le pointeur sur size_t pour être sûr que ça va, mais est-ce que ça ne changera pas l'égalité des pointeurs quand on utilise l'héritage? –

+0

Ce n'est pas une bonne idée de le faire. Cela ressemble plus à un hack! Si vous suivez ceci, assurez-vous de le documenter si bien! – Chubsdad

+1

s'il vous plaît utiliser au moins intptr_t ou uintptr_t, ils sont là pour une raison. –

1

Pourquoi n'introduis-vous simplement une classe de base factice pour toutes vos classes sérialisables?

class Serializable 
{ 
}; 

map< Serializable *, int > integralMap; 
Questions connexes