这可以做到吗?
enum A
{
enum B
{
SOMETHING1,
SOMETHING2
};
enum C
{
SOMETHING3,
SOMETHING4
};
};如果没有,是否有其他解决方案?
这个问题的目的:希望/需要能够做这样的事情:
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
};
};
};希望使用强类型的功能。
发布于 2013-02-25 06:02:20
No,它们不能以这种方式嵌套。事实上,任何编译器都会拒绝它。
如果没有,是否有其他解决方案?
这在很大程度上取决于你试图实现的目标(解决什么问题?)。如果您的目标是能够编写像A::B::SOMETHING1这样的代码,那么您可以只在名称空间中定义它们,如下所示:
namespace A
{
enum B
{
SOMETHING1,
SOMETHING2
};
enum C
{
SOMETHING3,
SOMETHING4
};
}发布于 2013-02-25 07:13:21
考虑到在这种特殊情况下,枚举不太可能经常更改,您可以这样做:
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_等。
发布于 2013-02-25 06:38:34
MESONS pi = PI();
MATTER mat = pi;
assert (pi == mat);你介意C++11模板变魔术吗?
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目前不能超过两个层次结构,但如果您愿意,可以添加此功能)
https://stackoverflow.com/questions/15057140
复制相似问题