Wie Jerry sagte, ist es nicht direkt möglich. Eine Möglichkeit, dies zu lösen, ist, zwei Enums zu haben. Eine für die Kategorie und eine für die Unterkategorie.
Wie georgesl jedoch gesagt hat, kann es wohl gefährlich sein, dies in einem Protokoll zu tun. Sie sollten auf jeden Fall explizit die ENUM-Werte definieren:
struct Error
{
enum Type {
UNKNOWNTYPE = 0,
TYPE1 = 1,
TYPE2 = 2,
TYPE3 = 3
};
enum Subtype {
UNKNOWNSUBTYPE = 0,
// subtype for error type 1
CAUSE1 = 1001,
CAUSE2 = 1002,
CAUSE3 = 1003,
// subtype for error type 2
CAUSE4 = 2001,
CAUSE5 = 2002
};
Type type;
Subtype subtype;
};
int main()
{
Error error;
error.type = Error::TYPE1;
error.subtype = Error::CAUSE1;
}
Achten Sie darauf, die Zahlen mit Bedacht für zukünftige Erweiterungen zu wählen.
Update: machte das Beispiel tatsächlich funktioniert.
Alternative, mehr typsichere Lösung:
struct ErrorType
{
enum type {
UNKNOWNTYPE = 0,
TYPE1 = 1,
TYPE2 = 2,
TYPE3 = 3
};
};
struct ErrorSubtype
{
enum type {
UNKNOWNSUBTYPE = 0,
// subtype for error type 1
CAUSE1 = 1001,
CAUSE2 = 1002,
CAUSE3 = 1003,
// subtype for error type 2
CAUSE4 = 2001,
CAUSE5 = 2002
};
};
struct Error
{
ErrorType::type type;
ErrorSubtype::type subtype;
};
int main()
{
Error error;
error.type = ErrorType::TYPE1;
error.subtype = ErrorSubtype::CAUSE1;
}
Entschuldigung, aber die Antwort ist nein - Sie müssen einen anderen Weg finden, Dinge zu tun. Eine typische besteht darin, den Typ in eine Anzahl von oberen Bits in der Anzahl und die Ursache in eine Anzahl von niedrigeren Bits (z. B. 16-Bit-Wert, jeweils 8 Bit) zu codieren. –
Es ist nicht möglich, enum von enums zu haben, aber Sie könnten Ihre Daten darstellen, indem Sie den Typ und die Ursache getrennt entweder als Teil einer Struktur angeben oder bestimmte Bits für jedes der Felder zuweisen. – Tuxdude
selbst wenn Sie eine enum von enum haben könnten, da dort das Programm von zwei verschiedenen Maschinen ausgeführt wird, kann der Wert derselben Sub-enum (z. B. Type1Cause1) unterschiedlich instanziiert werden. Ist das nicht gefährlich? – lucasg