代码之家  ›  专栏  ›  技术社区  ›  Joseph Garvin

在C++中,如何将枚举导入到不同的命名空间中?

  •  26
  • Joseph Garvin  · 技术社区  · 16 年前

    namespace foo
    {
    
    enum bar {
        A
    };
    
    }
    
    namespace buzz
    {
    // Which of these two methods I use doesn't matter,
    // the results are the same.
    using foo::bar;
    //typedef foo::bar bar;
    }
    
    int main()
    {
        foo::bar f; // works
        foo::bar g = foo::A; // works
    
        buzz::bar x; // works
        //buzz::bar y = buzz::A; // doesn't work
        buzz::bar z = foo::A;
    }
    

    问题是枚举本身被导入,但它的元素都没有。不幸的是,在不破坏大量其他现有代码的情况下,我无法将原始枚举更改为封装在额外的虚拟名称空间或类中。我能想到的最佳解决方案是手动复制枚举:

    namespace buzz
    {
    enum bar
    {
        A = foo::A
    };
    }
    

    DRY principle . 有更好的办法吗?

    5 回复  |  直到 16 年前
        1
  •  27
  •   Mark B    16 年前

    将现有名称空间包装到嵌套名称空间中,然后在原始名称空间中“使用”该名称空间。

    namespace foo
    {
        namespace bar_wrapper {
            enum bar {
                A
            };
        }
        using namespace bar_wrapper;
    }
    
    namespace buzz
    {
        using namespace foo::bar_wrapper;
    }
    
        2
  •  9
  •   LumpN    16 年前

    虽然我最喜欢Mark B的方法,因为它不会破坏现有代码,但您也可以执行以下操作:

    namespace foo {
     enum bar {
      A, B [..]
     };
    }
    
    namespace buzz {
     using foo::bar;
     using foo::A;
     using foo::B;
     [..]
    }
    
        3
  •  6
  •   Abhay    16 年前

    枚举不是作用域,也不包含 枚举数 . 我认为不可能导入枚举值本身。尝试将枚举包装到结构/命名空间中并使用它。

        4
  •  4
  •   anton_rh    8 年前

    从C++ 11开始,你可以使用 enum class . 导入 枚举类 导入其所有值:

    namespace foo
    {
    
    enum class bar {
        A
    };
    
    }
    
    namespace buzz
    {
    using foo::bar;
    }
    
    int main()
    {
        foo::bar f;
        foo::bar g = foo::bar::A;
    
        buzz::bar x;
        buzz::bar y = buzz::bar::A;
        buzz::bar z = foo::bar::A;
    }
    

    http://coliru.stacked-crooked.com/a/2119348acb75d270 .

        5
  •  1
  •   In silico    16 年前

    如果你真的需要这样做,试试看 using namespace foo; using foo::bar;