에서, 열거하면, 자주 변경 가능성이 없습니다
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
두 계층 이상 작동하지 않습니다,하지만이 추가 될 수 있습니다) 당신이 입자의 다른 유형에 대해 다른
enum
유형을 원하는 이유는, 그러나 놀라움을
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
};
// ...
}
}
: 갈 수 있습니다. 유형 Mesons
의 인수를 허용하지만 형식이 Leptons
이 아닌 함수가 있습니까? 그렇지 않은 경우 모든 함수에서 입자를 허용하면 enum
단일 문자를 사용하고 MATTER_MESONS_
, MATTER_BARYONS_
등의 이름에 긴 접두어를 사용하지 않는 것이 좋습니다.
"이 작업을 수행 할 수 있습니까?" => 컴파일러가 알려줄 것입니다 (아니오). 대체 솔루션에 관해서는 정확히 무엇을하고 싶습니까? – Jon
1. 시도해 보셨습니까? 2. 정확히 무엇을하고 싶습니까? –
이 코드를 컴파일하면 어떻게됩니까? –