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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在C ++中将枚举导入不同的命名空间?相关的知识,希望对你有一定的参考价值。

我在命名空间中有一个枚举,我想使用它,就像它在不同的命名空间中一样。直观地说,我认为我可以使用'using'或'typedef'来实现这一目标,但实际上都没有。用于证明它的代码片段,在GCC和Sun CC上测试:

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。有没有更好的办法?

答案

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

namespace foo
{
    namespace bar_wrapper {
        enum bar {
            A
        };
    }
    using namespace bar_wrapper;
}

namespace buzz
{
    using namespace foo::bar_wrapper;
}
另一答案

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

namespace foo {
 enum bar {
  A, B [..]
 };
}

namespace buzz {
 using foo::bar;
 using foo::A;
 using foo::B;
 [..]
}
另一答案

这里的问题是using声明只引入枚举的名称,而不是其值的名称。枚举不是范围,也不带有普查员的姓名。我认为不可能自己导入枚举值。尝试将enum包装在struct / namespace中并使用它。

另一答案

从C ++ 11开始,您可以使用enum class。导入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

另一答案

如果你真的需要这样做,试试using namespace foo;而不是using foo::bar;。但是,将枚举封装在类或另一个命名空间中是一个更好的主意。

以上是关于如何在C ++中将枚举导入不同的命名空间?的主要内容,如果未能解决你的问题,请参考以下文章

在 PHP 5.3 中使用命名空间自动加载?

如何在http get中将多个字符串传递给一个url?

如何在可重用的应用程序中将命名空间 url 与 django 一起使用

如何在 Visual Studio 中将用 C 编写的源代码从另一个项目包含到我自己的 C++ 项目中

如何在不同线程的 C++/CLI 中将图像数据从 BitmapSource (WPF) 复制到 cv::Mat (OpenCV)?

如何在 C 中将 IOCTL 发送到 Windows 上的所有驱动程序