考虑定义自己的全局命名空间的库
::libx
然后有嵌套的命名空间
ns1
ns2
等:
// lib code
namespace libx
{
namespace ns1
{
struct X1{};
}
namespace ns2
{
struct X2{};
}
}
有没有一种方法可以用lib的全局名称空间限定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
在标准库中(即使它没有明确地被非法化,我认为现在或将来可以打破LIB——我的意思是,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{};
}
实际上,我认为这与目标比较接近,但感觉像是黑客攻击,可能会产生混乱,并且不能在本地完成(例如在单个函数中)。除此之外,还有其他不利因素需要寻找(比如扰乱日常生活能力)?