Изменить: я знаю, что метод 1 по существу недействителен и, вероятно, будет использовать метод 2, но я ищу лучший хак или лучшее решение для смягчения разрастающейся, изменяемой распространения пространства имен.
У меня есть несколько определений классов или методов в одном пространстве имен, которые имеют разные зависимости, и хотели бы использовать наименьшее количество блоков пространства имен или явных выборок, но при группировании директив #include с определениями, которые требуют их как можно лучше. Я никогда не видел никаких указаний на то, что любому препроцессору может быть сказано исключить пространство имен {} из области содержимого #include, но я здесь, чтобы спросить, возможно ли что-то похожее на это: (см. Нижнюю часть для объяснения того, почему я хочу что-то мертвое простой)
// 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
Моя реальная проблема заключается в том, что у меня есть проекты, в которых модуль может нуждаться в разветвленности, но у него есть сосуществующие компоненты из ветвей в одной и той же программе. У меня есть классы, такие как FooA и т.д., Которые я назвал Foo:: A в надежде на то, что вы сможете менее болезненно отделяться от Foo:: v1_2:: A, где некоторым программам может понадобиться как Foo:: A, так и Foo:: v1_2:: A. Я бы хотел, чтобы "Foo" или "Foo:: v1_2" отображались только один раз для каждого файла, как только один блок пространства имен, если это возможно. Более того, я предпочитаю размещать блоки директив #include сразу над первым определением в файле, который их требует. Какой мой лучший выбор, или, альтернативно, что я должен делать вместо захвата пространств имен?