Dodatkowy ostatni element w enumie

0

Gdzieniegdzie spotykam się z czymś takim w C++ jak dodawanie dodatkowego elementu w enumie jak np:

enum class ZeroJedenDwa
{
    zero,
    jeden,
    dwa,
    lastItem
};

Z tego co się orientuję to można to wykorzystać do iterowania po enumie, więc sens ma. Natomiast pytanie, czy to jest w ogóle dobra praktyka? Robicie coś takiego? Słyszałem już podzielone zdania że powinno się w każdym enumie tak robić, albo w ogóle. Ciekawi mnie wasze zdanie 🤔

0

@Czitels:

Widziałem to, jak niektóre enumy miały inicjowaną wartość integerową.
To w jakimś tam sposób miało ułatwić napisać ... w sumie nie wiem co ...

Wyznaczyć implementację 8 bitową / 16 / 32 ? (tak 16 bitowe kompilatory miały)

Generalnie, jak wiele, enum w C/C++ jest spieprzony przez fatalną kompatybilność z integerem.

1

Widziałem to, jak niektóre enumy miały inicjowaną wartość integerową.
To w jakimś tam sposób miało ułatwić napisać ... w sumie nie wiem co ...

To może się przydać jeśli z jednej strony chcemy enumową składnię a nie inta i define'y, a z drugiej strony istotna jest konkretna reprezentacja binarna i konkretne wartości na styku z jakimś API.

0

Widziałem wyłącznie w celu wyznaczania liczby elementów enuma, który może się zmienić, aby potem móc po nich np. iterować. Np.

enum class color
{
    red,
    blue,
    green,
    count
};
// ...
for(int i = 0; i < static_cast<int>(color::count); i++) {
    color c = static_cast<color>(i);
    foo(c);
}
1
{
    red,
    blue,
    green,
    count
};
// ...
for(int i = 0; i < static_cast<int>(color::count); i++) {
    color c = static_cast<color>(i);
    foo(c);
}

Z dokladnoscia do nazwy/wartosci enuma i spacji po for wyglada identycznie jak kod ktory niedawno temu popelnilem, wiec odpowiedz na pytanie "Robicie coś takiego?" brzmi: sa osobniki ktore tak robia. A czy dobra praktyka? Na pewno lepsza niz zmiana ogolnego kodu, potencjalnie w wielu miejscach, tylko dlatego ze doszla nowa opcja.

1

Zwykle się to robi, gdy są potrzebne jakieś metadane na temat enuma.
Np gdy jest potrzebna konwersja napis <-> enum.
Albo, gdy jest potrzebna lista wartości.

Jest jednak alternatywa. magic_enum, kóre korzystając z rozszerzeń kompilatorów (wspiera gcc clang i msvc) potrafi policzyć wartości enum itp.
Używałem i działało dobrze, ale w małym projekcie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1