namespace cpp {}

C++ lernen, kennen, anwenden

Benutzer-Werkzeuge

Webseiten-Werkzeuge


kennen:include:any
no way to compare when less than two revisions

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.


kennen:include:any [2017-05-02 15:22] (aktuell) – angelegt - Externe Bearbeitung 127.0.0.1
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 von 127.0.0.1

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki