scoped enumeration (tsz. scoped enumerations)
enum class
(vagyis scoped enumeration, magyarul hatókörrel rendelkező felsorolási típus) a C++11-től kezdve bevezetett nyelvi elem, amely a régi enum
típust biztonságosabbá, modernebbé és modulárisabbá teszi.
enum class
?Az enum class
egy típusbiztos, hatókörhöz kötött felsorolási típus, amellyel konstansokat lehet definiálni egy típus alá szervezve. A célja, hogy elkerülje a régi enum
típus problémáit: névütközést, implicit konverziót int
típusra, és gyenge típusellenőrzést.
enum class Szin {
Piros,
Zold,
Kek
};
Ebben a példában Szin::Piros
, Szin::Zold
, és Szin::Kek
érvényes tagok. Nem lehet őket simán Piros
néven elérni, mint a régi enum
esetén.
enum
-mal
enum
:enum Szin {
Piros,
Zold,
Kek
};
Szin s = Piros; // működik
int i = Piros; // ez is működik (de veszélyes!)
enum class
:enum class Szin {
Piros,
Zold,
Kek
};
Szin s = Szin::Piros; // működik
int i = Szin::Piros; // fordítási hiba!
int
típusra konvertálni.Típusnév::Tag
formában érhetők el.int
, de lehet más is (unsigned
, char
, uint8_t
stb.).
enum class
enum class Allapot {
Elindult,
Futo,
Leallt
};
Allapot a = Allapot::Futo;
enum class
-selfor (int i = static_cast<int>(Allapot::Elindult); i <= static_cast<int>(Allapot::Leallt); ++i) {
std::cout << i << "\n";
}
switch (a) {
case Allapot::Elindult:
std::cout << "Elindult\n";
break;
case Allapot::Futo:
std::cout << "Fut\n";
break;
case Allapot::Leallt:
std::cout << "Leállt\n";
break;
}
enum class
tagokat nem lehet közvetlenül int-re konvertálni:
enum class Nap {
Hetfo = 1, Kedd, Szerda
};
int n = static_cast<int>(Nap::Kedd); // csak így lehet!
Alapértelmezés szerint int
, de megadható más típus is:
enum class Valasz : uint8_t {
Igen = 1,
Nem = 2
};
Ez hasznos, ha memóriát akarunk spórolni (pl. beágyazott rendszerekben).
A enum class
típus könnyen összehasonlítható és tesztelhető:
REQUIRE(motor.getAllapot() == Allapot::Futo);
Tulajdonság | enum
|
enum class
|
---|---|---|
Típusbiztonság | ❌ | ✅ |
Implicit int konv.
|
✅ | ❌ (csak cast-tal) |
Névütközés veszély | ✅ | ❌ |
Szintaktikai forma | Piros
|
Szin::Piros
|
Alapértelmezett típus | int
|
int (vagy megadható)
|
enum class
-t, ha új kódot írsz — ez a jövőbiztos megoldás.enum
-ot, hacsak nincs kompatibilitási kényszered (pl. C API-k).enum class
értékeket szeretnél kiíratni szövegként, készíts to_string
függvényt vagy használj std::map
.
Az enum class
a modern C++ egyik fontos újítása, amely biztonságosabb és strukturáltabb kódot eredményez. Minden olyan esetben, amikor korábban enum
-ot használtunk, ma már ajánlott enum class
-t alkalmazni, mert: