Pourquoi la norme C ++ ne spécifie pas que Toute préjudice dans l'injection de mes propres spécialisations dans le std :: hash
char * code>,
const char * code>,
Unsigné Char * Code>,
Const Unsigné Char * Code>, etc., etc.? C'est-à-dire que, il choisirait le contenu de la chaîne C jusqu'à ce que la null de terminaison soit trouvée. P>
std code> Espace de noms pour mon propre code? P>
3 Réponses :
Char * (et son ILK) ne signifie pas toujours une chaîne. Ils peuvent être des matrices d'octets simples ou des décharges de fichiers binaires ou de tout nombre d'autres choses. Si vous voulez dire chaîne en C ++, vous utilisez généralement la classe "String". P>
Quant à la création du vôtre, étant donné ce qui précède c'est une mauvaise idée. Pour les types définis par les utilisateurs, cependant, il est acceptable de créer des spécialisations de la STD :: Fonctions de l'espace de noms STD ::. p>
À propos de la seule fois Char * Code> est traité comme une mémoire tampon de pointe-to-null dans la bibliothèque standard C ++ est dans le code hérité-de-C,
std :: string code code > et dans certains
std :: tstream code> code. Je ne peux penser à ailleurs?
Je sais que char * code> ne toujours i> string moyen. Ce que je veux savoir, c'est si votre réponse est ce que le Comité standard C ++ pensait.
Il est acceptable de créer des spécialisations de STD :: Fonctions de l'espace de noms STD :: / CODE> Est-ce?
Il est difficile de savoir ce qu'ils pensaient, mais je supposerais que puisque leur code doit être tout ce qui concerne toutes les personnes, cela aurait certainement été une contrepartie. Je crois que spécialiser Const Char * est explicitement non autorisé, mais je ne trouve pas la référence pour le moment
Citer à partir du projet C ++ 0x N3000, 17.6.3.2.1.1.1.1.1.1.1. Mais les normes doivent contenir une section similaire): "[...] Un programme peut ajouter une spécialisation de modèle pour n'importe quel modèle de bibliothèque standard à Nomspace STD uniquement si le La déclaration dépend d'un type de liaison externe défini par l'utilisateur et de la spécialisation répond aux exigences de la bibliothèque standard pour le modèle d'origine et n'est pas explicitement interdite. "
Pourquoi la norme C ++ ne spécifie pas que
std :: hash
code> est spécialisé pour char * code>,
const char * code>,
Unsigné Char * Code>,
Const Unsigné Char * Code>, etc. P> blockQuote>
On dirait qu'il est originaire de Proposition N1456 . (l'emphase mine) p>
Certaines implémentations antérieures de la table de hachage ont donné un traitement spécial de Char *: il a spécialisé la fonction de hachage par défaut pour examiner la matrice de caractères indiquée, plutôt que le pointeur lui-même. Cette proposition supprime ce traitement spécial. Traitement spécial rend un traitement légèrement plus facile à utiliser des tables de hachage pour C chaîne, mais à
le coût de la suppression de l'uniformité et de rendre plus difficile l'écriture de code générique. Strong> Depuis que les utilisateurs naïfs devraient généralement utiliser STD :: basic_string Au lieu de c Strings, le coût du traitement spécial l'emporte sur l'avantage. P> blockQuote> Si je l'interprétant correctement, le raisonnement est que le soutien des chaînes de style C briserait génériquement des actes génériques sur les hachages des pointeurs. P>
Toute préjudice pour injecter mes propres spécialisations dans l'espace de noms STD pour mon propre code? P> blockQuote>
Il y a un préjudice potentiel, oui. p>
- à l'avenir, tout ce que vous avez ajouté à l'espace de noms code> std code> pourrait entrer en collision avec un nouveau nom de symbole. LI>
- Dans le présent, tout ce que vous ajoutez à l'espace de noms code> std code> pourrait être une "meilleure correspondance" pour d'autres composants de la bibliothèque standard, un comportement en silence. LI> ul>
Il existe une spécialisation standard pour les types de pointeur, voir ici
template< class T > struct hash<T*>;
Cela vaut parfois la peine, car si Char * est utilisé comme clé, et si nous utilisons un hachage de chaîne, nous devrons payer une allocation de mémoire supplémentaire et une copie pour chaque hachage.
Je dirais
Char * Code> et
Unsigné Char * CODE> est dangereux dans le contexte de hachage, d'autres avec
Const code> qualificatifs sont corrects. Ne pas injecter dans
std :: code>, faites simplement des spécialisations dans votre espace de noms.
Quelle est la durée de vie du
const char * code> que votre
std :: hash code> stocke? (
std :: hachage code> stocke ses valeurs de clé ainsi que les hacher). Comment distinguez-vous entre NULLL terminée
Const Char * CODE> et les pointeurs vers des caractères individuels?
std :: hachage code> est juste un objet de foncteur. Il hachait son argument. Ça ne le stocke pas.
Question parfaitement valable et les réponses sont i> soutenues par des faits et des références. Voter pour rouvrir.
Connexe: STD :: Valeur de hachage sur Char * Valeur et non sur l'adresse mémoire? - Ie pertinent si vous voulez savoir comment vous voulez savoir comment réellement hash a c-string alors ...