C++0x: Ausblick auf den neuen C++-Standard

Seite 2: TR1-Funkionen

Inhaltsverzeichnis

TR1 steht als Abkürzung für Technical Report 1 beziehungsweise ausführlich für das Dokument „ISO/IEC TR19768 C++ Library Extensions“ und stellt mengenmäßig voraussichtlich den größten Bestandteil von C++0x dar. TR1 selbst lässt sich wiederum in drei größere Bereiche untergliedern.

Der umfangreichste Teil besteht aus neuen Container- und Hilfsklassen, Support für Funktionsobjekte sowie Regular Expressions und der Unterstützung der Template-Metaprogrammierung. Ein Großteil davon ist innerhalb der Boost-Gemeinde entstanden, wird direkt in C++0x einfließen und hat daher verpflichtenden Charakter. Viele der Boost-Contributors und -Committers sitzen im C++-Standard-Komitee. TR1 ist mittlerweile per Abstimmung offiziell in C++0x aufgenommen.

Die Boost-Funktionen haben bereits in viele Bereiche der C++-Programmierung Einzug gehalten, und praktische Erfahrungen sind damit vorhanden. Boost kann als Nachfolger oder leistungsfähige Ergänzung zur STL gesehen werden, wobei die Boost-Funktionen und -Techniken weit über die der STL hinausgehen. Beispielsweise liefert Boost die relevanten Anteile für TR1 in Form von Templates für bisher nicht vorhandene generische Datenstrukturen (etwa Hash Tables), einen leistungsfähigen Parser für Regular Expressions sowie einen Zufallszahlengenerator. Ein besonderes Merkmal ist die Template-Metaprogrammierung. Boost selbst enthält noch weit mehr Funktionen als in TR1 vorhanden. Weitere Libraries sind schon für TR2 vorgeschlagen.

TR1 sieht außerdem Ergänzungen zu <cmath> vor. Im naturwissenschaftlichen Bereich etwa benötigt man häufiger bestimmte Polynome, Elliptische Integrale sowie Bessel-Funktionen; C++0x nimmt diese neu in <cmath> auf (und synchronisiert sich dadurch mit C99).

Welche Funktionen der neuen C99-Bibliothek in der C++0x-Library vorhanden sein werden, beschreibt TR1 ebenfalls. Demzufolge integriert C++0x die Neuerungen von C99 und wird damit nicht nur leistungsfähig, sondern auch zu diesem Standard (weitgehend) kompatibel sein.

Unter der Überschrift „General Utilities“ spezifiziert TR1 die zwei wichtigen Klassen shared_ptr und weak_ptr. Smart Pointers finden sich in nahezu jeder Applikation und verwalten automatisiert und effizient den Lebenzyklus von Objekten. Gleichzeitig verhindern sie Ressourcen-Leaks. Darüber hinaus kann der Programmierer mithilfe dieser Klassen gemeinsam genutzte Ressourcen verwalten. TR1 hat smart_ptr und weak_ptr von Boost übernommen, Boost selbst stellt noch weitere Pointer-„Hilfsklassen“ zur Verfügung.

Die „Function Objects“ von TR1 sind von Boost.Function übernommen und ermöglichen die komfortable Implementierung eines Callback-Mechanismus. Dabei kann der Programmierer nicht nur normale Funktions-Pointer verwenden (wie man sie von C/C++ her kennt), sondern zusätzlich Funktionsobjekte und -Pointer auf Memberfunktionen. Der normale Callback per Funktions-Pointer wurde hier also wesentlich erweitert und verallgemeinert. Callbacks dienen häufig dazu, Vorgänge zu entkoppeln (beispielsweise die Benutzeroberfläche von der Geschäftslogik). Die (Member-)Funktions-Pointer beziehungsweise Funktionsobjekte kann man speichern und erst später wiederverwenden. Dies war in der bisherigen Standard Library mit bind1st respektive bind2nd nicht machbar. Boost.Bind bietet hier mehr Unterstützung, ist deshalb in TR1 eingeflossen und wird von „Function Objects“ verwendet. Gleichzeitig werden auch sogenannte Lambda-Funktionen (lokal unbenannte Funktionen) verwendet. Lambda wurde als Spracherweiterung direkt in C++ aufgenommen und wird weiter unten noch beschrieben.