Рассмотрим библиотеку, которая определяет свое собственное глобальное пространство имен ::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)?