namespace cpp

C++ lernen, kennen, anwenden

Benutzer-Werkzeuge

Webseiten-Werkzeuge


kennen:include:any

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

kennen:include:any [2017-05-02 15:22] (aktuell)
Zeile 1: Zeile 1:
 +====== <any> ======
 +===== Beliebige Dinge verpacken =====
 +Der Typ ''​std::​any''​ kann ab C++17 Objekte jedes beliebigen Typs aufnehmen und wird damit ein typsicherer Ersatz für ''​void*''​.
 +Das verwaltete Objekt wird bei Zuweisung eines anderen Objektes zerstört, spätestens jedoch mit der Kapsel:
 +
 +<code cpp>
 +std::any o; // empty
 +o = 1;
 +o = 3.14;
 +o = "hello world";​
 +</​code>​
 +
 +===== Auspacken =====
 +Entpacken erfordert die Kenntnis der möglicherweise enthaltenen Typen.
 +Ein erfolgreicher ''​std::​any_cast<​ZielTyp>''​ auf die //Adresse// der Kapsel liefert einen gültigen Zeiger des Zieltyps:
 +<code cpp>
 +if (auto ptr = std::​any_cast<​int>​(&​o)) ​        ​std::​cout << *ptr << '​\n';​
 +if (auto ptr = std::​any_cast<​double>​(&​o)) ​     std::cout << *ptr << '​\n';​
 +if (auto ptr = std::​any_cast<​const char*>​(&​o)) std::cout << *ptr << '​\n';​
 +</​code>​
 +Wird //die Kapsel selbst// gecastet, erhält man bei passendem Typ Zugriff auf das enthaltene Objekt. Andernfalls wird eine Ausnahme geworfen: ​
 +<code cpp>
 +try
 +{
 +  std::cout << std::​any_cast<​int>​(o) << '​\n';​
 +}
 +catch(std::​bad_any_cast&​ err)
 +{
 +  std::cerr << err.what() << '​\n';​
 +}
 +</​code>​
 +===== Wegwerfen =====
 +Das enthaltene Objekt lässt sich bei Bedarf löschen:
 +<code cpp>
 +if (o.has_value()) o.reset();
 +</​code>​
 +
 +===== Objekt aus Parametern bauen =====
 +Das Objekt lässt sich direkt im Wrapper aus übergebenen Konstruktorparametern zusammensetzen:​
 +<code cpp>
 +std::any a(std::​in_place_type<​std::​string>,​ 10, '​-'​);​
 +
 +a.emplace<​std::​string>​(10,​ '​-'​);​
 +std::cout << std::​any_cast<​std::​string>​(a);​
 +</​code>​
  
kennen/include/any.txt · Zuletzt geändert: 2017-05-02 15:22 (Externe Bearbeitung)