首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >枚举类可以嵌套吗?

枚举类可以嵌套吗?
EN

Stack Overflow用户
提问于 2013-02-25 05:59:33
回答 4查看 15.3K关注 0票数 9

这可以做到吗?

代码语言:javascript
复制
enum A
{
    enum B
    {
        SOMETHING1,
        SOMETHING2
    };

    enum C
    {
        SOMETHING3,
        SOMETHING4
    };
};

如果没有,是否有其他解决方案?

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

代码语言:javascript
复制
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
        };
    };

};

希望使用强类型的功能。

EN

回答 4

Stack Overflow用户

发布于 2013-02-25 06:02:20

No,它们不能以这种方式嵌套。事实上,任何编译器都会拒绝它。

如果没有,是否有其他解决方案?

这在很大程度上取决于你试图实现的目标(解决什么问题?)。如果您的目标是能够编写像A::B::SOMETHING1这样的代码,那么您可以只在名称空间中定义它们,如下所示:

代码语言:javascript
复制
namespace A
{
    enum B
    {
        SOMETHING1,
        SOMETHING2
    };

    enum C
    {
        SOMETHING3,
        SOMETHING4
    };     
}
票数 15
EN

Stack Overflow用户

发布于 2013-02-25 07:13:21

考虑到在这种特殊情况下,枚举不太可能经常更改,您可以这样做:

代码语言:javascript
复制
namespace ParticleTypes {
    namespace Matter {
        enum Mesons {
            Pi
        };

        enum Baryons {
            Proton = Pi + 1,
            Neutron
        };

        enum Leptons {
            Electron = Neutron + 1
        };
    }

    namespace AntiMatter {
        enum AntiMesons {
            AntiPi = Matter::Electron + 1
        };

        // ...
    }
}

然而,我想知道为什么不同类型的粒子需要不同的enum类型。你有接受Mesons类型而不是Leptons类型的参数的函数吗?如果不是,并且您的所有函数都接受任何粒子,则使用单个enum -最好删除值名称的长前缀,如MATTER_MESONS_MATTER_BARYONS_等。

票数 3
EN

Stack Overflow用户

发布于 2013-02-25 06:38:34

代码语言:javascript
复制
MESONS pi = PI();
MATTER mat = pi;
assert (pi == mat);

你介意C++11模板变魔术吗?

代码语言:javascript
复制
template <typename T, typename... L>
struct is_defined_in : std::false_type {};

template <typename T, typename U, typename... L>
struct is_defined_in<T, U, L...> : is_defined_in<T, L...> {};

template <typename T, typename... L>
struct is_defined_in<T, T, L...> : std::true_type {};

template <int ID> struct helper {
  friend bool operator==(helper a, helper b)
  { return a.id == b.id; }
  friend bool operator!=(helper a, helper b)
  { return a.id != b.id; }

  int id=ID;
};
template <typename... B> struct category {
  int id;

  template <typename T,
            typename = typename std::enable_if<is_defined_in<T, B...>::value>::type>
  category(T t) : id(t.id) {}

  friend bool operator==(category a, category b)
  { return a.id == b.id; }
  friend bool operator!=(category a, category b)
  { return a.id != b.id; }
};

enum class ElementaryParticleTypesID
{ PI, PROTON, NEUTRON, ELECTRON };

struct PI       : helper<(int)ElementaryParticleTypesID::PI> {};
struct PROTON   : helper<(int)ElementaryParticleTypesID::PROTON> {};
struct NEUTRON  : helper<(int)ElementaryParticleTypesID::NEUTRON> {};
struct ELECTRON : helper<(int)ElementaryParticleTypesID::ELECTRON> {};

using MESONS = category<PI>;
using BARYONS = category<PROTON, NEUTRON>;
using LEPTONS = category<ELECTRON>;

using MATTER = category<MESONS, BARYONS, LEPTONS>;

(the static_assert目前不能超过两个层次结构,但如果您愿意,可以添加此功能)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15057140

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档