kennen:include:variant
no way to compare when less than two revisions
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
— | kennen:include:variant [2017-05-02 15:27] (aktuell) – angelegt - Externe Bearbeitung 127.0.0.1 | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
+ | ====== < | ||
+ | Die Kapsel '' | ||
+ | |||
+ | <code cpp> | ||
+ | #include < | ||
+ | #include < | ||
+ | |||
+ | std:: | ||
+ | { | ||
+ | if (question == 42) return ' | ||
+ | return double(question); | ||
+ | } | ||
+ | </ | ||
+ | ===== Einpacken ===== | ||
+ | Wird bei der Initialisierung kein Wert zugewiesen, gilt der erste Typ. | ||
+ | Später kann jeder aufgelistete Typ zugewiesen werden: | ||
+ | <code cpp> | ||
+ | std:: | ||
+ | std::cout << "type index: " << v.index() << ' | ||
+ | |||
+ | v = ' | ||
+ | v = 42.0; | ||
+ | // v = 42; // Fehler: Typ int unzulässig | ||
+ | v = findAnswer(6*9); | ||
+ | </ | ||
+ | |||
+ | ===== Auspacken ===== | ||
+ | Der Zugriff auf das enthaltene Objekt erfolgt durch Angabe des Zieltyps oder die Indexnummer '' | ||
+ | <code cpp> | ||
+ | if (auto* ptr = std:: | ||
+ | if (auto* ptr = std:: | ||
+ | if (auto* ptr = std:: | ||
+ | </ | ||
+ | Bei Erfolg liefert die Abfrage mit '' | ||
+ | Bei bekannten Typ kommt '' | ||
+ | <code cpp> | ||
+ | if (std:: | ||
+ | std::cout << "char: " << std:: | ||
+ | else std::cout << " | ||
+ | </ | ||
+ | |||
+ | Während die Angabe eines ungültigen Typs oder Typindexes einen Übersetzungsfehler erzeugt, | ||
+ | kann der Zugriff auf einen anderen als den aktuell enthaltenen Typ eine Ausnahme werfen: | ||
+ | <code cpp> | ||
+ | try | ||
+ | { | ||
+ | // std:: | ||
+ | std:: | ||
+ | } | ||
+ | catch(std:: | ||
+ | { | ||
+ | std::cerr << err.what() << ' | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | ===== Besucher ===== | ||
+ | Das enthaltene Objekt kann mit einem Besucher inspiziert werden, der Funktionsoperatoren für die möglicherweise enthaltenen Typen bereitstellt: | ||
+ | <code cpp> | ||
+ | struct AnswerVisitor | ||
+ | { | ||
+ | void operator()(char found) | ||
+ | void operator()(double found) { std::cout << " | ||
+ | }; | ||
+ | </ | ||
+ | |||
+ | <code cpp> | ||
+ | std:: | ||
+ | </ | ||
+ | Auch ein generischer Lambdaausdruck ist zulässig: | ||
+ | <code cpp> | ||
+ | std:: | ||
+ | findAnswer(' | ||
+ | ); | ||
+ | </ | ||
+ | |||
+ | ===== Leere Varianten ===== | ||
+ | Besitzt ein (erster) Typ der Typliste keinen Standardkonstruktor, | ||
+ | <code cpp> | ||
+ | struct S | ||
+ | { | ||
+ | S(int i) : i(i) {} | ||
+ | int i; | ||
+ | }; | ||
+ | |||
+ | std:: | ||
+ | v = 42; | ||
+ | </ | ||
+ | |||
+ | ===== Objekt aus Parametern bauen ===== | ||
+ | Objekte lassen sich aus deren Konstruktorparametern vor Ort erzeugen: | ||
+ | <code cpp> | ||
+ | std:: | ||
+ | std:: | ||
+ | std:: | ||
+ | v.emplace< | ||
+ | |||
+ | std::cout << std:: | ||
+ | </ | ||
kennen/include/variant.txt · Zuletzt geändert: 2017-05-02 15:27 von 127.0.0.1