zurück zum Artikel

C++-Library: Boost 1.77 zielt auf Lambdas und Reflexion

Rainald Menge-Sonnentag

Lambda2 erlaubt das einfache Formulieren von Funktionsobjekten, während Describe Beschreibungen für Enumerationen und Members von Klassen sowie Structs bringt.

Das Team hinter der C++-Bibliothek Boost hat Version 1.77 des Projekts veröffentlicht. Das Release bringt zwei neue Libraries mit, die sich der Reflexion und einfachen Lambdas widmen. Beide bauen auf C++14 auf. Daneben hat das Release zahlreiche Ergänzungen und Bugfixes für bestehende Libraries mit an Bord, darunter eine neue Version von Boost.Filesystem.

Der Neuzugang Describe ist eine Reflexions-Library [1], die der Beschreibung von Enumerations- und Klassentypen dient. Einige C++-Bibliotheken bieten bereits Reflexionsmechanismen für diese Typen. Erklärtes Ziel von Describe ist, ein standardisiertes Vorgehen zu bieten. Anders als die in Boost 1.75 eingeführte [2] Bibliothek Boost.PFR [3] (Precise and Flat Reflection), die einen einfachen Zugriff auf die Elemente eines Struct bietet, setzt sie auf eine explizite Beschreibung über Makros. So lässt sich eine Enumeration über BOOST_DESCRIBE_ENUM beschreiben, und das erweiterte Makro BOOST_DEFINE_ENUM fasst die eigentliche Definition über enum mit der Beschreibung zusammen.

Der Befehl describe_enumerators<E> ruft schließlich die Beschreibung auf. Das Iterieren über die einzelnen Elemente erfolgt über die Metaprogrammier-Library Mp11 [4]. Analog dazu beschreiben die Makros BOOST_DESCRIBE_STRUCT und BOOST_DESCRIBE_CLASS Structs beziehungsweise Klassen.

Die Library Lambda2 [5], die vom selben Autor stammt wie Describe, bietet einen einfachen Ansatz, um Ausdrücke mit Platzhaltern wie _1 + 5 oder _1 > _2 als Funktionsobjekte zu nutzen. Der Header <functional> bietet mit std::bind eine Umsetzung für Funktionsobjekte mit Platzhaltern wie _1 für die Parameter und zugehörige Implementierungen mathematischer und logischer Operatoren wie std::plus oder std::logical_not.

Als Beispiel für den Einsatz führt die Beschreibung eine Funktion auf, die alle geraden Zahlen in einem Bereich zählt:

#include <boost/lambda2.hpp>
#include <algorithm>

using namespace boost::lambda2;

int count_even( int const * first, int const * last )
{
    return std::count_if( first, last, _1 % 2 == 0 );
}

Bei den vorhandenen Libraries ist vor allem nennenswert, dass die Dateisystembibliothek Boost.Filesystem auf Version 4 wechselt. Alle in v3 als überholt (deprecated) markierten Features entfallen damit. Dafür kennt sie zusätzliche Windows-Präfixe wie \..

Mitglieder des C++-Standardisierungskomitees haben im Jahr 2000 das Boost-Projekt gegründet. Ziel war vor allem, Vorschläge für Erweiterungen der Programmiersprache öffentlich bereitzustellen und dadurch praktische Tests zu ermöglichen, bevor Neuerungen in den Standard einfließen. Boost hat in den letzten zwanzig Jahren jedoch unabhängig von den Standardisierungsvorschlägen ein relevantes Eigenleben im C++-Universum entwickelt und sich als wichtige Bibliothekensammlung etabliert.

Weitere Details lassen sich der Ankündigung von Boost 1.77 [6] entnehmen. Die Library steht auf der Downloadseite in unterschiedlichen Formaten [7] für Windows und Unix bereit.

(rme [8])


URL dieses Artikels:
https://www.heise.de/-6165850

Links in diesem Artikel:
[1] https://www.boost.org/doc/libs/1_77_0/libs/describe/doc/html/describe.html
[2] https://www.heise.de/news/C-Bibliothek-Boost-1-25-bringt-JSON-Parser-Fehlerbehandlung-und-Reflexion-4988498.html
[3] https://www.boost.org/doc/libs/1_75_0/doc/html/boost_pfr.html
[4] https://www.boost.org/doc/libs/1_77_0/libs/mp11/doc/html/mp11.html
[5] https://www.boost.org/doc/libs/1_77_0/libs/lambda2/doc/html/lambda2.html
[6] https://www.boost.org/users/history/version_1_77_0.html
[7] https://www.boost.org/users/download/
[8] mailto:rme@ix.de