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

发布于 2024-09-10 19:56:31 字数 786 浏览 3 评论 0原文

我在命名空间中有一个枚举,我想像在不同的命名空间中一样使用它。直觉上,我认为我可以使用“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 原则。有更好的办法吗?

I have an enum in a namespace and I'd like to use it as if it were in a different namespace. Intuitively, I figured I could use 'using' or 'typedef' to accomplish this, but neither actually work. Code snippet to prove it, tested on GCC and 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;
}

The problem is that the enum itself is imported but none of its elements. Unfortunately, I can't change the original enum to be encased in an extra dummy namespace or class without breaking lots of other existing code. The best solution I can think of is to manually reproduce the enum:

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

But it violates the DRY principle. Is there a better way?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

怼怹恏 2024-09-17 19:56:35

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

If you really need to do this, try using namespace foo; instead of using foo::bar;. However, it's a much better idea to encapsulate the enum in a class or in another namespace.

意中人 2024-09-17 19:56:34

从 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

Starting from C++11 you can use enum class. Importing enum class imports all its values:

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;
}

The code above successfully compiles: http://coliru.stacked-crooked.com/a/2119348acb75d270.

只有影子陪我不离不弃 2024-09-17 19:56:34

C++20 中终于有一个很好的解决方案。 using enum 声明将所有枚举值导入到当前作用域中。在您的示例中:

namespace foo {
enum bar {
  A
};
}

namespace buzz {
using foo::bar;
using enum foo::bar;
}

int main() {
  foo::bar f;
  foo::bar g = foo::A;

  buzz::bar x;
  // now this works
  buzz::bar y = buzz::A;
}

请注意,您仍然需要一个简单的 using 声明才能在范围内获取枚举的名称。

There is finally a good solution for this in C++20. The using enum declaration imports all of the enumeration values into the current scope. In your example:

namespace foo {
enum bar {
  A
};
}

namespace buzz {
using foo::bar;
using enum foo::bar;
}

int main() {
  foo::bar f;
  foo::bar g = foo::A;

  buzz::bar x;
  // now this works
  buzz::bar y = buzz::A;
}

Note that you still also need a plain using declaration in order to get the enumeration’s name in the scope.

梦醒时光 2024-09-17 19:56:33

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

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

namespace buzz
{
    using namespace foo::bar_wrapper;
}

Wrap the existing namespace in a nested namespace which you then "use" in the original namespace.

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

namespace buzz
{
    using namespace foo::bar_wrapper;
}
扭转时空 2024-09-17 19:56:33

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

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

namespace buzz {
 using foo::bar;
 using foo::A;
 using foo::B;
 [..]
}

While i like the approach of Mark B best, because it doesn't break existing code, you can also do the following:

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

namespace buzz {
 using foo::bar;
 using foo::A;
 using foo::B;
 [..]
}
一个人的旅程 2024-09-17 19:56:33

这里的问题是 using 声明仅引入枚举的名称,而不是其值的名称。 枚举不是作用域,也不带有枚举的名称
枚举器
。我认为不可能自行导入枚举值。尝试将枚举包装在结构/命名空间中并使用它。

The problem here is that the using declaration pulls in only the name of the enum, and not the names of its values. Enum's aren't scopes and don't carry along the names of the
enumerators
. I don't think it is possible to import the enum values themselves. Try wrapping the enum in a struct/namespace and use it.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文