Ma bibliothèque utilise plusieurs espaces de noms imbriqués, disposés comme suit:
MyLibrary::MyContainer<int> Numbers = MyLibrary::Utilities::MyContainer::Insert(OtherContainer, 123, 456); // Oh God, my eyes...
4 Réponses :
Une déclaration dans un fichier d'en-tête nécessite la liste de noms de non polluer l'espace de noms global: mais dans le fichier source, vous pouvez utiliser des états: p>
J'évite habituellement en utilisant code> car dans mes projets, j'ai souvent l'impression que cela réduit la compréhension de ce qui vient d'où, mais dans un cas comme celui-ci, je le recommanderais fortement. C'est votre meilleur pari pour garder les choses propres si vous ne seriez pas à propos de l'ambiguïté.
Le nom pleinement qualifié ne se ressemble pas vraiment aussi mauvais pour moi, mais j'aime être explicite dans la méthode et les noms de classe. Mais Vous pouvez probablement vous échapper avec un et ensuite, vous pouvez importer les fonctions spécifiques dont vous avez besoin: p> Et puis
en utilisant code> peut aider les choses:
à l'aide d'un espace de noms Espace Mylibrary Code> à la portée globale dans vos fichiers source, ce qui en fait: P> < Pré> xxx pré>
à l'aide de myLibrary :: utilitaires :: myContainer :: insérer code> p> p> P>
myContainer
Si quelque chose fait mal, arrêtez de le faire. Il n'est absolument pas nécessaire d'utiliser des espaces de noms profondément imbriqués en C ++ - ils ne sont pas destinés à être des dispositifs architecturaux. Mon propre code utilise toujours un seul niveau d'espaces de noms.
Si vous insistez sur l'utilisation d'espaces de noms imbriqués, vous pouvez toujours créer des alias courts pour eux: P>
int x = Util::somefunc(); // calls Library::Utility::somefunc()
Regardez comment la bibliothèque standard (ou le boost) est organisée. Presque tout cela est dans le célibataire Boost met la plupart des choses em> les choses à l'intérieur Mais vous ne voyez pas généralement des hiérarchies de noms de noms profondes ou fines, car ils sont juste douloureux de travailler avec, et il y a peu de bénéfices à aucun bénéfice. p> Voici quelques bonnes règles de pouce: p> Les fonctions d'assistance liées à une classe spécifique doivent être dans la même espace de noms que la classe, permettre à ADL de fonctionner. Ensuite, vous n'avez pas besoin de qualifier le nom de la fonction d'assistance lorsque vous l'appelez. (J'aime comment vous pouvez appeler pour tout Sinon, rappelez-vous que le but des espaces de noms est d'éviter les affrontements de nom et pas beaucoup d'autre. Donc, toute votre bibliothèque doit être dans un espace de noms em> pour éviter les affrontements avec le code d'utilisateur, mais dans cet espace de noms, il n'y a pas de besoin technique pour d'autres espaces de sous-noms à moins que vous ne prévoyez d'introduire des noms d'affichage. P> Vous voudrez peut-être séparer les internes de votre bibliothèque dans un espace de sous-noms, de sorte que les utilisateurs ne les ramassent pas accidentellement à partir de l'espace de noms principal, similaire à Boost's mais Généralement, je suggérerais que quelques espaces de noms imbriqués aussi possible. P> et enfin, j'ai tendance à faire du point d'utiliser des noms courts, faciles à en tenir et facile à lire pour mes espaces de noms (à nouveau , juste la première règle sur les fonctions d'assistance et ADL permettrait à votre exemple d'être réécrit comme ceci à la place: P> std code> Espace de noms. Il y a juste peu à gagner en mettant tout à l'intérieur de son espace de noms.
boost code>, tandis que les bibliothèques em> Subnamespace unique (
Boost :: mpl code> ou
boost :: Système de fichiers code>, par exemple). Et les bibliothèques définissent généralement un seul
AUX code> Subnamespace pour les détails de la mise en œuvre interne. P>
trier code> au lieu de
std :: trier code> sur les itérateurs définis dans
std code>). P>
AUX CODE>. P>
std code> est un bon exemple à suivre. Court et au point, et presque toujours sans autres espaces de noms imbriqués, vous ne recevez donc pas une crampe de devoir l'écrire souvent, et donc il ne le fait pas. t encombrer trop votre code source.) p>
Lib::MyContainer<int> Numbers = Insert(OtherContainer, 123, 456);
Je veux upvouver C'est comme cinq fois. J'ai utilisé plus d'une bibliothèque avec un espace de noms code> superflu code> [ou similaire], et ils ont toujours l'impression que le développeur d'origine vient de détester la surcharge et l'ADL et souhaitait s'assurer que le compilateur ne pouvait pas utiliser de celui-ci.
Jamais utilisé boost . Fusion ? C'est beaucoup la même chose.