использование внутреннего пространства имен во внешнем пространстве имен без повторного открытия внешнего пространства имен - PullRequest
2 голосов
/ 13 октября 2019

Рассмотрим библиотеку, которая определяет свое собственное глобальное пространство имен ::libx, а затем имеет вложенные пространства имен ns1, ns2 и т. Д.:

// lib code
namespace libx
{
    namespace ns1
    {
        struct X1{};
    }

    namespace ns2
    {
        struct X2{};
    }
}

Существует ли способ квалификации всех видов использованияlib с его глобальным пространством имен, но пропустить вложенные пространства имен? Вот так:

// user code
auto test()
{
    // using ????

    libx::X1 x1{};
    libx::X2 x2{};
}

Единственный способ, которым я могу придумать, - это вновь открыть его глобальное пространство имен:

// user code
namespace libx // reopening lib's namespace
{
    using namespace ns1;
    using namespace ns2;
}

Но это может быть недопустимым (например, namespace std в стандартной библиотеке)(и даже если это явно не запрещено, я думаю, что это может сломать библиотеку сейчас или в будущем - я имею в виду, должна быть причина, почему C ++ запрещает это для стандартной библиотеки) и не может быть выполнена локально (например, внутри одной функции)


Альтернатива, о которой я подумал:

Переименование каждого из вложенных пространств имен:

// user code
auto test()
{
    namespace libx1 = libx::ns1;
    namespace libx2 = libx::ns2;

    libx1::X1 x1{};
    libx2::X2 x2{};
}

Но для каждого вложенного пространства имен существуют разные квалификаторы.

Создайте новое глобальное пространство имен, куда вы поместите все вложенные пространства имен:

//user code:
namespace libx_all
{
    using namespace libx;
    using namespace libx::ns1;
    using namespace libx::ns2;
}

auto test()
{
    namespace libx1 = libx::ns1;

    libx_all::X1 x1{};
    libx_all::X2 x2{};
}

На самом деле, я думаю, это довольно близко подходит к цели, но похоже на хак, может породить путаницу и не может быть выполнено локально (например, внутри одной функции). Кроме того, есть ли другие недостатки, на которые нужно обратить внимание (например, возиться с ADL)?

...