C++17: Was gibt es Neues? Vollständiger Leitfaden mit Beispielen für Profis

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Was bringt C++17? Analyse der wichtigsten Neuerungen des Standards

\n\n

Wenn Sie in C++ programmieren und im Mainstream bleiben möchten, dann ist C++17 die Version, die Sie jetzt erlernen sollten. Sie wurde bereits 2017 veröffentlicht, aber viele Projekte „hängen" immer noch an C++14 oder sogar C++11 fest, aus Angst vor der Umstellung auf den neuen Standard. Zu Unrecht.

\n\n

In diesem Artikel analysieren wir die neuen Funktionen von C++17 anhand realer Beispiele. Sie erfahren, wie Sie Code vereinfachen, überflüssige Prüfungen vermeiden und Programme schneller machen können. Wir werden nicht alle 105 Änderungen auflisten – nur das, was in der Praxis wirklich nützlich ist.

\n\n

1. Structured Bindings – Dekomposition in Sekundenschnelle

\n\n

Eine der praktischsten Features von C++17 sind die Structured Bindings. Früher musste man für die Zerlegung eines Tupels oder eines Paares std::tie schreiben oder auf Indizes zugreifen. Jetzt ist das Ganze viel eleganter.

\n\n

Beispiel: Rückgabe mehrerer Werte aus einer Funktion

\n\n
#include <iostream>\n#include <tuple>\n#include <string>\n\nstd::tuple<int, std::string, double> getData() {\n    return {42, "Antwort", 3.14};\n}\n\nint main() {\n    // C++17: eine Zeile statt std::tie\n    auto [id, name, value] = getData();\n    std::cout << name << ": " << id << " (" << value << ")\\n";\n    return 0;\n}
\n\n

Was hat sich geändert? Früher musste man Variablen separat deklarieren und dann std::tie aufrufen. Jetzt erledigt auto [a, b, c] die ganze Arbeit für Sie.

\n\n

Structured Bindings funktionieren nicht nur mit Tupeln, sondern auch mit Arrays und allen Strukturen, die öffentliche Member haben. Dies ist eine der Neuerungen von C++17, die den Code sauberer und lesbarer macht.

\n\n

2. std::optional – Abschied von „magischen" Werten

\n\n

Wie oft haben Sie Code gesehen, in dem eine Funktion -1 oder nullptr zurückgibt, um einen Fehler anzuzeigen? Oder noch schlimmer – ein bool-Flag und das Ergebnis per Referenz? std::optional<T> löst dieses Problem ein für alle Mal.

\n\n

Beispiel: Sichere Suche in einem Container

\n\n
#include <iostream>\n#include <optional>\n#include <map>\n#include <string>\n\nstd::optional<int> findValue(const std::map<std::string, int>& m, const std::string& key) {\n    auto it = m.find(key);\n    if (it != m.end()) {\n        return it->second;  // Wert vorhanden\n    }\n    return std::nullopt;    // kein Wert vorhanden\n}\n\nint main() {\n    std::map<std::string, int> ages = {{"Alice", 30}, {"Bob", 25}};\n    \n    auto result = findValue(ages, "Charlie");\n    if (result) {\n        std::cout << "Gefunden: " << *result << "\\n";\n    } else {\n        std::cout << "Schlüssel nicht gefunden\\n";\n    }\n    \n    // Oder verwenden Sie value_or für einen Standardwert\n    int age = result.value_or(0);\n    return 0;\n}
\n\n

std::optional ist ein Container, der einen Wert enthalten oder leer sein kann. Sie prüfen ihn mit if (opt) und greifen auf den Wert mit *opt oder opt.value() zu. Das ist viel sicherer als „vereinbarte" Fehlercodes.

\n\n

3. if constexpr – Templates ohne Kopfschmerzen

\n\n

C++17 neue Funktionen für die Metaprogrammierung sind ein echtes Geschenk. if constexpr ermöglicht die bedingte Kompilierung innerhalb von Templates ohne SFINAE-Akrobatik.

\n\n

Beispiel: Universelle Funktion für verschiedene Typen

\n\n
#include <iostream>\n#include <type_traits>\n#include <string>\n\ntemplate <typename T>\nvoid printInfo(const T& value) {\n    if constexpr (std::is_integral_v<T>) {\n        std::cout << "Ganze Zahl: " << value << "\\n";\n    } else if constexpr (std::is_floating_point_v<T>) {\n        std::cout << "Gleitkommazahl:                

Blogs

Buchempfehlungen