Редактировать: я знаю, что метод 1 по сути недопустим и, вероятно, будет использовать метод 2, но я ищу лучшее решение или лучшее решение для уменьшения безудержного, изменчивого распространения пространства имен.
У меня есть несколько определений классов или методов в одном пространстве имен, которые имеют разные зависимости, и я хотел бы использовать как можно меньше блоков пространства имен или явных областей видимости, но при этом группируя директивы #include с определениями, которые требуют их как можно лучше. Я никогда не видел никаких признаков того, что какой-либо препроцессор мог бы сказать, чтобы исключить область имен {} scoping из содержимого #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 непосредственно над первым определением в файле, который требует их. Какой мой лучший выбор, или, в качестве альтернативы, что я должен делать вместо того, чтобы захватывать пространства имен?