枚举类可以嵌套吗?

use*_*501 7 c++ c++11 enum-class

可以这样做吗?

enum A
{
    enum B
    {
        SOMETHING1,
        SOMETHING2
    };

    enum C
    {
        SOMETHING3,
        SOMETHING4
    };
};
Run Code Online (Sandbox Code Playgroud)

如果没有,是否有替代解决方案?

这个问题的目的:想要/需要能够做这样的事情:

enum class ElementaryParticleTypes
{

    enum class MATTER
    {
        enum class MESONS
        {
            PI
        };

        enum class BARYONS
        {
            PROTON,
            NEUTRON
        };

        enum class LEPTONS
        {
            ELECTRON
        };
    };

    enum class ANTI_MATTER
    {
        enum class ANTI_MESONS
        {
            ANTI_PI
        };

        enum class ANTI_BARYONS
        {
            ANTI_PROTON
            ANTI_NEUTRON
        };

        enum class ANTI_LEPTONS
        {
            POSITRON
        };
    };

};
Run Code Online (Sandbox Code Playgroud)

希望使用强类型功能.

And*_*owl 10

,他们不能以这种方式嵌套.实际上,任何编译器都会拒绝它.

如果没有,是否有替代解决方案?

这主要取决于你想要达到的目标(解决什么问题?).如果你的目标是能够编写类似的东西A::B::SOMETHING1,你可以在命名空间中定义它们,这样:

namespace A
{
    enum B
    {
        SOMETHING1,
        SOMETHING2
    };

    enum C
    {
        SOMETHING3,
        SOMETHING4
    };     
}
Run Code Online (Sandbox Code Playgroud)

  • 那将是'A :: SOMETHING1`; `A :: B :: SOMETHING1`需要`enum class B`. (9认同)
  • 值得注意的是,尽管 `A::B::SOMETHING1` 在 C++11 中有效,除非 `enum B` 更改为 `enum class B`,正如 Neil 所建议的那样,`B::` 是可选的。 (4认同)
  • @尼尔:你确定?我认为在 C++11 中这是允许的。[这对我有用](http://ideone.com/02OaiB) (2认同)

use*_*501 -7

(仍然)没有办法做到这一点(2023 年)。最接近的方法是在一个枚举内定义一长列表中的所有内容。

enum class A{
  PARTICLE_MATTER_BARYON_PROTON,
  PARTICLE_MATTER_BARYON_NEUTRON,
  PARTICLE_ANTIMATTER_BARYON_PROTON // etc
};
Run Code Online (Sandbox Code Playgroud)

  • 这个答案是不正确的。您可以使用命名空间,这将为您提供所需的嵌套。我并不是说您必须接受我的答案,但如果您发布自己的答案的唯一目的是不接受任何其他答案,至少请确保它是正确的。(顺便说一句,我不是反对者) (8认同)