blindage #inclure, à l'intérieur de l'espace de noms { } bloc?

Edit: je sais que la méthode 1 est essentiellement non valide et ne sera probablement utiliser la méthode 2, mais je suis à la recherche pour le meilleur hack ou une meilleure solution pour atténuer rampant, mutable espace de noms de la prolifération.

Je plusieurs la classe ou la méthode définitions dans un espace de noms différent de dépendances, et souhaitez utiliser le moins d'espace de noms de blocs ou explicite scopings possible, mais alors que le groupement des directives #include avec les définitions qui nécessitent du mieux que possible. Je n'ai jamais vu aucune indication que toute préprocesseur pourrait être dit à exclure de l'espace de noms {} la portée de #inclure du contenu, mais je suis ici pour vous demander si quelque chose de semblable à cela est possible: (voir en bas pour l'explication de pourquoi je veux quelque chose de simple morts)

//NOTE: apple.h, etc., contents are *NOT* intended to be in namespace Foo!

//would prefer something most this:
#pragma magic_namespace_backout(1) //FIXME: use actually existing directive
namespace Foo {

#include "apple.h"
B *A::blah(B const *x) { /* ... */ }

#include "banana.h"
int B::whatever(C const &var) { /* ... */ }

#include "blueberry.h"
void B::something() { /* ... */ }

} //namespace Foo

...

//over this:
#include "apple.h"
#include "banana.h"
#include "blueberry.h"

namespace Foo {
B *A::blah(B const *x) { /* ... */ }
int B::whatever(C const &var) { /* ... */ }
void B::something() { /* ... */ }
} //namespace Foo

...

//or over this:
#include "apple.h"
namespace Foo {
B *A::blah(B const *x) { /* ... */ }
} //namespace Foo

#include "banana.h"
namespace Foo {
int B::whatever(C const &var) { /* ... */ }
} //namespace Foo

#include "blueberry.h"
namespace Foo {
void B::something() { /* ... */ }
} //namespace Foo

Mon vrai problème, c'est que j'ai des projets dans lesquels un module peut avoir besoin d'être ramifiés, mais ont la coexistence des composants à partir des branches dans le même programme. J'ai des classes comme FooA, etc., que j'ai appelé Foo::dans l'espoir d'être en mesure de branche de moins en moins douloureusement que Foo::v1_2::A, où un programme peut avoir besoin à la fois d'un Foo::Un et un Foo::v1_2::A. je voudrais "Toto" ou "Foo::v1_2" pour montrer jusqu'n'est vraiment qu'une seule fois par fichier, comme un espace de noms unique bloc, si possible. De plus, j'ai tendance à préférer pour localiser les blocs de directives #include, immédiatement au-dessus de la première définition dans le fichier qui les exige. Quel est mon meilleur choix, ou sinon, que dois-je faire à la place de détourner les espaces de noms?

Je suis juste allé avec l'option #2 et essayer d'être aussi propre que possible avec les includes.

OriginalL'auteur Jeff | 2010-05-19