enum class (rozšíření komponent C++)
Deklaruje výčet, což je uživatelem definovaný typ tvořený sadou pojmenovaných konstant nazývaných enumerátory.
Všechny moduly runtime
Poznámky
Jazyky C++/CX a C++/CLI podporují třídy public enum class a private enum class podobné standardní třídě výčtu jazyka C++, avšak doplněné o specifikátor přístupnosti.Další informace o starém klíčovém slově jazyka C++ enum naleznete v tématu Deklarace výčtu C++.
Windows Runtime
Syntaxe
access enum class enumeration-identifier [:underlying-type] { enumerator-list } [var];
access enum struct enumeration-identifier [:underlying-type] { enumerator-list } [var];
Parametry
access
Přístupnost výčtu, může nabývat hodnot public nebo private.enumeration-identifier
Název výčtu.underlying-type
(Volitelné) Typ, na němž je výčet založen.(Volitelné.Pouze architektura Windows Runtime) Typ, na němž je výčet založen. Hodnoty mohou být bool, char, char16, int16, uint16, int, uint32, int64 nebo uint64.
enumerator-list
Čárkami oddělený seznam názvů enumerátorů.Hodnota každého enumerátoru je konstantní výraz definovaný buď implicitně kompilátorem, nebo explicitně zápisem enumerátor=konstantní výraz.Ve výchozím nastavení je hodnota prvního enumerátoru nula, je-li implicitně definována.Hodnota každého následujícího implicitně definovaného enumerátoru je hodnota předchozího enumerátoru + 1.
var
(Volitelné) Název proměnné typu výčtu.
Poznámky
Další informace a příklady naleznete v tématu týkajícím se výčtů.
Povšimněte si, že kompilátor vyvolá chybové zprávy, nemůže-li být konstantní výraz definující hodnotu enumerátoru vyjádřen typem určeným v parametru underlying-type.Kompilátor však nehlásí chybu u hodnoty, která pro daný typ není vhodná.Příklad:
Je-li parametr underlying-type číselný a některý enumerátor představuje maximální hodnotu tohoto typu, nelze hodnotu dalšího implicitně definovaného výčtu vyjádřit.
Je-li parametr underlying-type hodnoty bool a jsou-li implicitně definovány více než dva enumerátory, nelze enumerátory následující po prvních dvou vyjádřit.
Je-li parametr underlying-type hodnoty char16 a nachází-li se hodnota výčtu v rozsahu 0xD800 až 0xDFFF, lze hodnotu reprezentovat.Hodnota je však logicky nesprávná, protože představuje polovinu náhradního páru znakové sady Unicode a neměla by se vyskytovat izolovaně.
Požadavky
Možnost kompilátoru: /ZW
Common Language Runtime
Syntaxe
access enum class name [:type] { enumerator-list } var;
access enum struct name [:type] { enumerator-list } var;
Parametry
access
Přístupnost výčtu.Může nabývat hodnoty public nebo private.enumerator-list
Čárkami oddělený seznam identifikátorů (enumerátorů) ve výčtu.name
Název výčtu.Anonymně spravované výčty nejsou povoleny.type (volitelné)
Příslušný typ identifikátorů.Může jím být libovolný skalární typ, například znaménková či neznaménková verze typu int, short nebo long.Typ bool či char je také povolen.var (volitelné)
(Volitelné) Název proměnné typu výčtu.
Poznámky
Deklarace enum class a enum struct jsou ekvivalentní.
Existují dva typy výčtů: spravované a standardní.
Spravovaný výčet lze definovat následujícím způsobem
enum class day {sun, mon };
a je sémanticky rovnocenný se zápisem
ref class day {
public:
static const int sun = 0;
static const int mon = 1;
};
Standardní výčet lze definovat následujícím způsobem:
enum day2 {sun, mon, };
a je sémanticky rovnocenný se zápisem
static const int sun = 0;
static const int mon = 1;
Názvy spravovaných enumerátorů (identifikátorů) nejsou vloženy do oboru, kde je výčet definován. Všechny odkazy na enumerátory musí být plně kvalifikované (název::identifikátor).Z tohoto důvodu nelze definovat anonymní spravovaný výčet.
Enumerátory standardního výčtu jsou do ohraničujícího oboru vkládány silně.To znamená, že pokud v ohraničujícím oboru existuje jiný symbol s názvem shodným s enumerátorem, kompilátor vygeneruje chybu.
V jazycích Visual C++ 2002 a Visual C++ 2003 byly enumerátory vkládány slabě (viditelné v ohraničujícím oboru, pokud se v něm nenacházel identifikátor se stejným názvem).
Je-li definován standardní výčet jazyka C++ (bez klíčového slova class nebo struct), bude při kompilaci s možností /clr výčet kompilován jako spravovaný.Výčet má stále sémantiku nespravovaného výčtu.Povšimněte si, že pro identifikaci programátorova záměru udělat výčet nativním, kompilátor vkládá atribut Microsoft::VisualC::NativeEnumAttribute rozpoznatelný kompilátorem jazyka Visual C++.Jiné kompilátory uvidí běžný výčet jednoduše jako spravovaný.
Pojmenovaný, standardní výčet zkompilovaný s možností /clr bude viditelný v sestavení jako spravovaný výčet a může být využit jiným spravovaným kompilátorem.Nepojmenovaný standardní výčet však nebude v sestavení veřejně viditelný.
V jazycích Visual C++ 2002 a Visual C++ 2003 by standardní výčet použití jako typ v parametru funkce:
// mcppv2_enum.cpp
// compile with: /clr
enum E { a, b };
void f(E) {System::Console::WriteLine("hi");}
int main() {
E myi = b;
f(myi);
}
generoval následující kód MSIL pro signaturu funkce:
void f(int32);
Aktuální verze kompilátoru však standardní výčet emitují jako spravovaný výčet s atributem [NativeEnumAttribute] a následujícím kódem MSIL pro signaturu funkce:
void f(E)
Další informace o nativních výčtech naleznete v tématu týkajícím se deklarace výčtu v jazyce C++.
Ve vývojovém prostředí lze pro tato klíčová slova získat nápovědu zvýrazněním klíčového slova (enum class, například) a stisknutím klávesy F1.
Další informace o výčtech CLR naleznete v tématech:
Požadavky
Možnost kompilátoru: /clr
Příklady
Příklad
sestupně
// mcppv2_enum_2.cpp
// compile with: /clr
// managed enum
public enum class m { a, b };
// standard enum
public enum n { c, d };
// unnamed, standard enum
public enum { e, f } o;
int main() {
// consume managed enum
m mym = m::b;
System::Console::WriteLine("no automatic conversion to int: {0}", mym);
System::Console::WriteLine("convert to int: {0}", (int)mym);
// consume standard enum
n myn = d;
System::Console::WriteLine(myn);
// consume standard, unnamed enum
o = f;
System::Console::WriteLine(o);
}Optionally, copy this sequence of tags for each example you want, then populate the text nodes. That is, after section+title("Examples")+content, insert: para+embeddedLabel ("Example")+para(sample description); code(sample); para+embeddedLabel("Output"); computerOutput(sample output, including 'br' tag instead of newlines)
Výsledek