代码之家  ›  专栏  ›  技术社区  ›  bolov

在外部命名空间中使用内部命名空间而不重新打开外部命名空间

  •  0
  • bolov  · 技术社区  · 7 年前

    考虑定义自己的全局命名空间的库 ::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{};
    }
    

    实际上,我认为这与目标比较接近,但感觉像是黑客攻击,可能会产生混乱,并且不能在本地完成(例如在单个函数中)。除此之外,还有其他不利因素需要寻找(比如扰乱日常生活能力)?

    0 回复  |  直到 7 年前