09.03.2012
Version: 4
Hinweis - die erste Version dieses Artikels entspricht den Folien des Vortrags, den ich am 22.02.2012 auf dem 3-ten C++ Treffen in Düsseldorf gehalten habe. Mittlerweile habe ich einzelne Hinweise und neue Informationen eingearbeitet - siehe Versions-Historie.
Inhaltsverzeichnis
1. Einführung
Boost - eine Sammlung "freier, portabler, begutachteter" C++ Bibliotheken-
Motivation
- Welchen Boost würde die Entwicklung mit C++ bekommen, wenn es Bibliotheken gäbe, die die Möglichkeiten von C++ nutzen würden.
-
Idee
- Erweiterung der Stärken von C++ durch qualitativ hochwertige und in die C++ Philosophie passende Bibliotheken
- Ohne dass die Bibliotheken gleich einen ISO Standardisierungs-Prozeß durchlaufen müssen
-
Boost ist nahe an der C++ Standardisierung
-
Gegründet auf einem Treffen des ISO C++ Standardisierungs-Komitees
- Beman Dawes and Robert Klarer
- C++ standard committee meeting in Sophia Antipolis, France
- März 1998
- Viele Mitglieder des ISO C++ Standardisierungs-Komitees sind aktiv im Boost Umfeld tätig
-
Viele Boost-Bibliotheken:
-
sind Bestandteil des neuen aktuellen Standards C++11
- 10 Bibliotheken waren Bestandteil des TR1
-
werden Bestandteil des nächsten Standards C++16 sein
- Weitere Bibliotheken sind im TR2 und weitere kommen hinzu
- TR2 gibt es ganz aktuell (Feb. 2012) nicht mehr – später mehr dazu
-
sind Bestandteil des neuen aktuellen Standards C++11
-
Gegründet auf einem Treffen des ISO C++ Standardisierungs-Komitees
-
Allgemeines zu Boost
- http://www.boost.org
-
Aktuelle Version 1.48.0
- Vom 15.11.2011
-
Nächste Version 1.49.0
- Release Candidate ist vorhanden
- Vom 20.02.2012
- Ende Februar sollte 1.49.0 erscheinen
- Hinweis: am 24.02.2012 ist die Boost Version 1.49.0 erschienen.
- Boost versucht, 4 Versionen im Jahr herauszubringen
-
Aber warum sollte man Boost überhaupt nutzen?
- Viele sinnvolle und hilfreiche Bibliotheken (siehe später)
-
Vor allem waren einige Dinge in C++03 ohne Boost nur schwer umsetzbar
- Z.B. Exception-Sicherheit bei dynamischen Objekten - gerade in Verbindung mit z.B. STL Containern
- Lösung: Boost Shared-Pointer
- Darum sind die Boost Shared-Pointer auch in C++11 aufgenommen worden
- Alternativ waren natürlich auch andere Smart-Pointer nutzbar (Loki, zlib,…)
-
Smart-Pointer
- Vor C++11 die typische Einstiegsdroge in Boost
-
Boost 1.48.0 umfaßt 111 C++ Bibliotheken
- Von sehr sehr kleinen bis hin zu sehr großen Bibliotheken
-
Eine davon ist nur für die interne Boost-Nutzung „config“
- Um Compiler-Spezialitäten und Fehler abzufangen
- Aber 110 stehen zur allgemeinen Verfügung
-
Boost Bibliotheken sind prinzipiell reines ISO C++
- Nie compiler-spezifische Abhängigkeiten
-
Meistens ohne plattform-spezifische Abhängigkeiten
-
Ausnahme:
- Bibliotheken, die auf den Plattform APIs aufsetzen
-
Beispiele:
-
Boost Filesystem
- Kapselt die Datei-System Infos und Zugriffe der Plattform
-
Boost Thread
- Kapselt das Thread Interface der Platform
-
Boost Filesystem
-
Diese haben natürlich plattform-spezifische Abhängigkeiten
- Sind darum für exotische Plattformen wie z.B. Haiku oft nicht vorhanden
-
Ausnahme:
-
Viele Boost Bibliotheken stellen hohe Anforderungen bzgl. der ISO Kompatibilität der Compiler
-
Sehr sehr alte Compiler (wie z.B. GCC 2.9.5, MSVS 6.0, Open-Watcom 1.3, Borland 5, usw.) haben hier Probleme
- Aber leider werden diese Compiler noch immer in manchen Firmen eingesetzt
-
Abgesehen von den Plattform-Wrapper-Bibliotheken sollten alle Bibliotheken bei aktuellen Compilern funktionieren
- Daher auch auf exotischen Plattformen stehen einem die meisten Bibliotheken zur Verfügung.
-
Sehr sehr alte Compiler (wie z.B. GCC 2.9.5, MSVS 6.0, Open-Watcom 1.3, Borland 5, usw.) haben hier Probleme
-
Viele Unix Distributionen enthalten die Boost Bibliotheken
- Z.B. Fedora, Debian oder NetBSD
-
Meist liegen hier auch schon die compilierten Libs vor
- Leider auch häufig nicht die aktuellsten Versionen - Boost updatet halt 4 x im Jahr
- Und unter Windows? Das sehen wir gleich noch...
-
Alle Bibliotheken durchlaufen vor der Aufnahme einen formalen Review-Prozeß
-
Dies sichert:
- Hohe Qualität der Schnittstellen
- Hohe Qualität der Implementierung
- Angemessene Nutzung der C++ Techniken
- Relativ hohe Qualität der Dokumentation
- Jeder kann Bibliotheken für Boost einreichen
- Jeder kann sich am Review-Prozeß beteiligen
-
Problem sind zur Zeit die fehlenden Review-Manager
- Aber hier werden nur erfahrende Boost-Maintainer genommen
-
Dies sichert:
-
Viele Boost Bibliotheken funktionieren rein als Header
- Basieren rein auf Templates
- Daher ist keine compilierte Lib notwendig
- Dies gilt uneingeschränkt für 94 der 111 Bibliotheken
-
Dadurch sehr einfache Nutzung dieser header-only Bibliotheken
- Boost Bibliothek von http://www.boost.org herunterladen
- Auspacken
- Header einbinden
- Fertig
-
Boost Bibliotheken, die zwingend compilierte Libs benötigen:
- Boost.Filesystem
- Boost.GraphParallel
- Boost.IOStreams
- Boost.MPI
- Boost.ProgramOptions
- Boost.Python
- Boost.Regex
- Boost.Serialization
- Boost.Signals
- Boost.System
- Boost.Thread
- Boost.Wave
-
Boost Bibliotheken, die zum Teil Libs benötigen
-
Boost.DateTime
- Nur bei String (to & from) Konvertierung
- Und bei alten Microsoft und Borland Compilern
-
Boost.Graph
- Nur wenn GraphViz Dateien geparst werden sollen
-
Boost.Math
- Für die TR1 und C99 Mathematik Funktionen
-
Boost.Random
- Nur bei der Nutzung von “random_device”
-
Boost.Test
- Kann auch rein „header-only“ genutzt werden
- Die empfohlene Nutzung ist aber mit compilierter Lib
-
Boost.DateTime
-
Compilierte Libs erstellen:
- Ist detailliert in der Boost Dokumentation beschrieben
-
Im Prinzip nur ein Aufruf des Compilers mit:
-
BJam
- Boost Jam
- Boost Make-System
- Version 2: "b2" (seit 1.47.0 – vorher "bjam")
-
und Compiler-Toolset auf der Kommandozeile
- Für alle normalen Compiler liegen entsprechende Make-Infos bereit
-
BJam
- compilierte Libs in eigenes Projekt aufnehmen
- Fertig
-
Beispiel Microsoft Visual Studio:
-
Erzeugen der compilierten Libs:
- Auf der Kommandozeile:
- Als erstes Aufruf von "bootstrap" (seit Boost 1.45.0 notwendig)
- b2 --toolset=msvc-10.0 --build-dir=C:\boost\temp --build-type=complete stage
- Baut komplett alle compilierten Libs in allen Kombinationen (--build-type=complete)
-
Erzeugt:
- 248 Dateien
- 1,40 GByte
-
Soviel aufgrund vieler Kombinationen von Compiler-Schaltern
- Singe-Threaded, Multi-Threaded, Debug, Release, Dll, Lib,...
-
Bei den Microsoft Compilern genügt sogar nur die Angabe des Pfads zu den compilierten Libs
- Boost unterstützt das Auto-Linking Feature der Microsoft Compiler
- Für die meisten Microsoft Compiler finden sich fertig compilierte Boost Libs bei boostpro computing.
-
Erzeugen der compilierten Libs:
-
Achtung – Boost Bibliotheken können sich ändern
- Boost ist und bleibt auch eine C++ Spielwiese
- Die Boost Aktiven lernen dazu
- Erkenntnisse aus der Standardisierung werden eingearbeitet
-
Schnittstellen können sich ändern
-
Meist wird Abwärtskompatibilität sicher gestellt, z.B. mit:
- Alte Versionen bleiben parallel vorhanden
- Alte Schnittstellen können durch Makros aktiviert werden
-
Beispiele
- Spirit 1.0 => 2.x
- Filesystem 1, 2 und 3
-
Meist wird Abwärtskompatibilität sicher gestellt, z.B. mit:
-
Boost Mailing Listen
- Überblick
-
4 allgemeins Mailing-Listen
- Users
- Developers
- Announce
- Interest
-
11 projekt-spezifische Mailing-Listen
- Build, Python, Spirit, Documentation, Testing, Thread,…
-
Seit 2007 jährlich statt findene Boost-Konferenzen
-
C++Now 2012 ("ehemals BoostCon’12")
- May 14-18 2012 in Aspen, Colorado, USA
- Neue URL: http://cppnow.org/
- Alte URL: http://boostcon.boost.org/
-
Themen, z.B.:
- A Complete Overview on Boost.Jam and Boost.Build
- AST Construction with the Universal Tree
- Automatic Hybrid MPI+OpenMP Code Generation
- Boost.Generic: Concepts without Concepts
- Boost.Process: Process management in C++
- Creating Boost.Asio extensions
- Fast numerical computation in C++ (Expression Templates and Beyond to Lazy Code Generation (LzCG))
- Getting Jiggy with Proto — Hands-on Tutorial on C++ EDSL Design
- Object-relational mapping with ODB and Boost
-
C++Now 2012 ("ehemals BoostCon’12")
-
Last but not least
-
Sehr großzügige Boost Software Lizenz
- BSL (Boost Software Lizenz)
- Problemlos auch in kommerziellen Projekten verwendbar
- Kein irgendwie gearteter Zwang für die entstandenen Sourcen und Programme
- http://www.boost.org/users/license.html
-
Sehr großzügige Boost Software Lizenz
2. Bibliotheken
-
Kategorien
- String- und Text-Bearbeitung (10 St.)
- Container (16 St.)
- Iteratoren (5 St.)
- Algorithmen (8 St.)
- Funktions-Objekte (inkl. Signal und FP) (12 St.)
- Generische Programmierung (10 St.)
- Template Metaprogrammierung (6 St.)
- Präprozessor Metaprogrammierung (1 St.)
- Parallele Programmierung (4 St.)
- Mathematik und Numerik (18 St.)
- Korrektheit und Test (3 St.)
- Datenstrukturen (13 St.)
- Bild-Bearbeitung (1 St.)
- Ein- und Ausgabe (7 St.)
- Unterstützung anderer Sprachen (Python) (1 St.)
- Speicher (3 St.)
- Parsen (1 St.)
- Programmier Schnittstellen (2 St.)
- Verschiedenes (26 St.)
- Compiler-Workarounds (2 St.)
-
Alle 111 Bibliotheken vorzustellen ist viel zuviel
-
Ein paar schauen wir uns detaillierter an:
- Smart-Pointer, Pointer-Container
- String-Algorithmen
- Assign
- Bind & Lambda (BLL)
- Date-Time
- Random
- Filesystem
- Regex
- Serialization
- Thread
- Spirit
- Und ein paar weitere erwähne ich noch
- Aber unterm Strich werde ich natürlich keiner gerecht
-
Ein paar schauen wir uns detaillierter an:
2.1 Smart-Pointer
- Smart-Pointer Bibliothek
-
Enthält 6 "intelligente" Zeiger-Klassen
- Unterscheiden sich durch ihre Besitz-Strategien
-
Zum Teil nun auch Bestandteil von C++11
- Shared- und Weak-Ptr
-
Shared-Ptr ermöglicht STL-Container mit Smart-Pointern
- std::auto_ptr ist nicht STL-Algorithmen kompatibel
- std::auto_ptr ist daher in C++11 deprecated
-
Smart-Pointer:
-
scoped_ptr
- Einfacher Besitz, kann nicht kopiert werden
-
scoped_array
- Einfacher Besitz, kann nicht kopiert werden - für Arrays
-
shared_ptr
- Implementiert verteilten Besitz (Referenced-Counting)
-
shared_array
- Implementiert verteilten Besitz (Referenced-Counting) - für Arrays
-
weak_ptr
- Referenced-Counting ohne Besitz, für Kreis-Referenzen mit Shared-Ptr
-
intrusive_ptr
- Implementiert verteilten Besitz, wobei Referenced-Counting Bestandteil des referenzierten Objekts ist - z.B. bei Windows COM
-
scoped_ptr
-
Wahrscheinlich wichtigste Boost-Bibliothek
- Ohne sie ist z.B. nur schwer exception-sicherer Code möglich
- Typische Einstiegs-Droge in die Boost-Nutzung
- Benötigt keine compilierte Lib, funktioniert rein mit Headern
// Beispiel 1 - Smart-Pointer
#include <algorithm>
#include <iostream>
#include <vector>
#include <boost/shared_ptr.hpp>
using namespace std;
int main()
{
typedef boost::shared_ptr<int> int_ptr;
vector<int_ptr> v1, v2;
for (int i=0; i<5; ++i)
{
int_ptr ptr(new int(i)); // nicht optimal - siehe naechstes Beispiel
v1.push_back(ptr);
v2.push_back(ptr);
}
cout << "v1: " << v1.size() << " => ";
for_each(v1.cbegin(), v1.cend(), [](const int_ptr& pn) { cout << *pn << ' '; });
cout << endl;
cout << "v2: " << v2.size() << " => ";
for_each(v2.cbegin(), v2.cend(), [](const int_ptr& pn) { cout << *pn << ' '; });
cout << endl;
}
Ausgabe:
v1: 5 => 0 1 2 3 4
v2: 5 => 0 1 2 3 4
// Beispiel 2 - Smart-Pointer
#include <algorithm>
#include <iostream>
#include <vector>
#include <boost/shared_ptr.hpp>
#include <boost/make_shared.hpp>
using namespace std;
int main()
{
typedef boost::shared_ptr<int> int_ptr;
vector<int_ptr> v1, v2;
for (int i=0; i<5; ++i)
{
int_ptr ptr = boost::make_shared<int>(i); // besser
v1.push_back(ptr);
v2.push_back(ptr);
}
cout << "v1: " << v1.size() << " => ";
for_each(v1.cbegin(), v1.cend(), [](const int_ptr& pn) { cout << *pn << ' '; });
cout << endl;
cout << "v2: " << v2.size() << " => ";
for_each(v2.cbegin(), v2.cend(), [](const int_ptr& pn) { cout << *pn << ' '; });
cout << endl;
}
Ausgabe:
v1: 5 => 0 1 2 3 4
v2: 5 => 0 1 2 3 4
2.2 Pointer-Container
- Wird ein Shared-Pointer nur mit einem Container eingesetzt
- Alternative Boost.Pointer-Container
-
Nachbildung der STL Container
- Arbeitet intern mit speziellen Shared-Pointern
- Der Container wird mit Zeigern befüllt
- Die Nutzer-Schnittstelle ist wie bei normalen STL Containern mit Referenzen definiert
-
Vorteile
- Schneller, weniger Speicher, effizienter
- Das Referenz-Counting ist Teil des Containers
-
Nachteil
- Kann nicht in jedem Fall eingesetzt werden
- Nicht so vielfältig wie normaler Container und normale Shared-Pointer
- Benötigt keine compilierte Lib, funktioniert rein mit Headern
// Beispiel 3 - Pointer-Container
#include <iostream>
#include <boost/ptr_container/ptr_vector.hpp>
using namespace std;
int main()
{
boost::ptr_vector<int> v;
v.push_back(new int(11)); // Hinzufuegen mit einem Zeiger
v.push_back(new int(22));
v.push_back(new int(33));
cout << v[0] << endl; // Aber normale Nutzung
cout << v[1] << endl;
cout << v[2] << endl;
cout << "v: " << v.size() << " => ";
boost::ptr_vector<int>::const_iterator it = v.begin();
for (; it!=v.end(); ++it)
{
cout << *it << ' '; // Auch hier normale Nutzung
}
cout << endl;
cout << "Lambda => ";
for_each(v.cbegin(), v.cend(), [](int n) { cout << n << ' '; }); // Und auch hier
cout << endl;
}
Ausgabe:
11
22
33
v: 3 => 11 22 33
Lambda => 11 22 33
2.3 String-Algorithm
- Boost String Algorithm Library
- Sammlung von ergänzenden Funktionen für die String-Klasse
-
Themen z.B.:
- Groß-/Kleinschreibung (im Rahmen des gesetzten Locales)
- Trimmen
- Suchen und Ersetzen
- Splitting
- Klassifikation
- uvm...
-
Funktionen sind meist kopierend und verändernd vorhanden
- Verändernde Funktionen: Rückgabe void und ohne Postfix
- Kopierende Funktionen : Rückgabe string und mit Postfix "_copy"
- Benötigt keine compilierte Lib, funktioniert rein mit Headern
// Beispiel 4 - String-Algorithm 1
#include <iostream>
#include <string>
#include <boost/algorithm/string/case_conv.hpp>
#include <boost/algorithm/string/trim.hpp>
using namespace std;
int main()
{
string s(" ABC-123-def ");
cout << '"' << s << "\"\n";
string sl(boost::algorithm::to_lower_copy(s));
cout << '"' << sl << "\"\n";
string su(boost::algorithm::to_upper_copy(s));
cout << '"' << su << "\"\n";
string st(boost::algorithm::trim_copy(s));
cout << '"' << st << "\"\n";
boost::algorithm::to_lower(s);
cout << '"' << s << "\"\n";
boost::algorithm::to_upper(s);
cout << '"' << s << "\"\n";
boost::algorithm::trim(s);
cout << '"' << s << "\"\n";
}
Ausgabe:
" ABC-123-def "
" abc-123-def "
" ABC-123-DEF "
"ABC-123-def"
" abc-123-def "
" ABC-123-DEF "
"ABC-123-DEF"
// Beispiel 5 - String-Algorithm 2
#include <iostream>
#include <iostream>
#include <string>
#include <boost/algorithm/string/replace.hpp>
using namespace std;
int main()
{
string s("C++ ist toll und C++ ist gut");
cout << s << endl;
boost::algorithm::replace_all(s, " ", "__");
cout << s << endl;
}
Ausgabe:
C++ ist toll und C++ ist gut
C++__ist__toll__und__C++__ist__gut
// Beispiel 6 - String-Algorithm 3
#include <iostream>
#include <string>
#include <vector>
#include <boost/algorithm/string/split.hpp>
#include <boost/algorithm/string/classification.hpp>
using namespace std;
int main()
{
string s("Hallo 7,-Ich lerne-jetzt 9*C++.");
cout << s << endl;
vector<string> v;
boost::algorithm::split(v, s, boost::algorithm::is_any_of(" -*"));
for (vector<string>::iterator it=v.begin(); it!=v.end(); ++it)
{
cout << '\'' << *it << "'\n";
}
}
Ausgabe:
Hallo 7,-Ich lerne-jetzt 9*C++.
'Hallo'
'7,'
'Ich'
'lerne'
'jetzt'
'9'
'C++.'
// Beispiel 7 - String-Algorithm 4
#include <iostream>
#include <string>
#include <vector>
#include <boost/algorithm/string/split.hpp>
#include <boost/algorithm/string/classification.hpp>
using namespace std;
int main()
{
string s("Hallo 7,-Ich lerne-jetzt 9*C++.");
cout << s << endl;
vector<string> v;
boost::algorithm::split(v, s, boost::algorithm::is_digit());
for (vector<string>::iterator it=v.begin(); it!=v.end(); ++it)
{
cout << "-> '" << *it << "'\n";
}
}
Ausgabe:
Hallo 7,-Ich lerne-jetzt 9*C++.
-> 'Hallo '
-> ',-Ich lerne-jetzt '
-> '*C++.'
2.4 Assign
- Boost-Assignment-Library
- Erlaubt komfortable Initialisierung und Zuweisung der STL Container mit Wert-Sequenzen
-
Kleine hilfreiche Lib um Code zu vereinfachen
- Nichts weltbewegendes - aber im Kleinen doch sehr hilfreich
- Gerade auch für Sequenzen und Maps sehr hilfreich – siehe Beispiele
-
Verliert in C++11 mit Initialisierungs-Listen an Bedeutung
- Aber noch hat kaum einer C++11 und Initialisierungs-Listen zur Verfügung
- Benötigt keine compilierte Lib, funktioniert rein mit Headern
// Beispiel 8 - Assign 1
#include <vector>
#include <iostream>
using namespace std;
int main()
{
vector<int> v;
v.push_back(1); // furchtbar...
v.push_back(5);
v.push_back(9);
v.push_back(12);
vector<int>::const_iterator it = v.begin();
for (; it!=v.end(); ++it)
{
cout << *it << ' ';
}
cout << endl;
}
Ausgabe:
1 5 9 12
// Beispiel 9 - Assign 2
#include <vector>
#include <iostream>
#include <boost/assign/list_of.hpp>
using namespace std;
using namespace boost::assign;
int main()
{
vector<int> v = list_of(1)(5)(9)(12);
vector<int>::const_iterator it = v.begin();
for (; it!=v.end(); ++it)
{
cout << *it << ' ';
}
cout << endl;
}
Ausgabe:
1 5 9 12
// Beispiel 10 - Assign 3
#include <vector>
#include <iostream>
#include <boost/assign/list_of.hpp>
using namespace std;
using namespace boost::assign;
int main()
{
vector<int> v = list_of(1).repeat(11, 2)(3);
vector<int>::const_iterator it = v.begin();
for (; it!=v.end(); ++it)
{
cout << *it << ' ';
}
cout << endl;
}
Ausgabe:
1 2 2 2 2 2 2 2 2 2 2 2 3
// Beispiel 11 - Assign 4
#include <iostream>
#include <string>
#include <map>
#include <boost/assign/list_of.hpp>
using namespace std;
using namespace boost::assign;
int main()
{
map<int, string> m = map_list_of(1, "Max")(3, "Jan")(2, "Ina");
for (map<int, string>::const_iterator it=m.begin(); it!=m.end(); ++it)
{
cout << it->first << " -> " << it->second << '\n';
}
}
Ausgabe:
1 -> Max
2 -> Ina
3 -> Jan
2.5 Bind
- Boost Bind
-
Anpassung von Aufruf-Argumenten an vorhandene Signaturen
-
Von Funktionen
- Freien Funktionen
- Element-Funktionen
- Von Funktions-Objekten
-
Von Funktionen
-
Erzeugung von Funktions-Objekten „im Vorübergehen“
- Ohne Performance Verschlechterungen
- Basiert auf Expression Templates
-
Nutzung bei STL-Algorithmen, Threads, Event-Steuerung, uvm.
- Halt überall da, wo man Funktions-Objekte benötigt bzw. nutzen kann
- Bestandteil von C++11
- Benötigt keine compilierte Lib, funktioniert rein mit Headern
// Beispiel 12 - Bind
#include <algorithm>
#include <iostream>
#include <vector>
#include <boost/bind.hpp>
using namespace std;
bool myless(int n1, int n2)
{
return n1<n2;
}
int main()
{
vector<int> v;
v.push_back(1);
v.push_back(2);
v.push_back(7);
v.push_back(11);
v.push_back(13);
cout << "v:";
for_each(v.cbegin(), v.cend(), [](int n) { cout << ' ' << n; });
cout << '\n';
int n4 = count_if(v.begin(), v.end(), boost::bind(myless, _1, 4));
cout << "Anzahl Werte kleiner als 4: " << n4 << '\n';
int n8 = count_if(v.begin(), v.end(), boost::bind(myless, _1, 8));
cout << "Anzahl Werte kleiner als 8: " << n8 << endl;
}
Ausgabe:
v: 1 2 7 11 13
Anzahl Werte kleiner als 4: 2
Anzahl Werte kleiner als 8: 3
2.6 Boost Lambda Library (BLL)
- Boost Lambda Library (BLL)
-
Ermöglicht die Angabe von Code direkt in Funktions-Aufrufen
- Kürzerer Code
- Höhere Lokalität des Codes
- Anlehnung an das Lambda Kalkül aus funktionalen Sprachen
-
Im Hintergrund wird automatisch ein entsprechendes Funktions-Objekt erzeugt
- Vergleichbar zu Boost Bind
- Bei einem guten Compiler ist BLL Code genauso performant wie optimierter handgeschriebener Code
-
Mit C++ 11 und Lambda Ausdrücken wird die Bedeutung der BLL abnehmen
- Aber noch können viele Programmierer keine C++11 Lambda Ausdrücke nutzen
-
Boost enthält noch eine zweite funktionale Lib: Phönix
- Phönix ist aus Spirit hervorgegangen
- Es gab mal Bestrebungen, beide Biblitheken zusammenzuführen, aber daraus ist (bislang) nichts geworden
- Benötigt keine compilierte Lib, funktioniert rein mit Headern
// Beispiel 13 - Boost Lambda Library (BLL)
#include <vector>
#include <algorithm>
#include <iostream>
#include <boost/assign/list_of.hpp>
#include <boost/lambda/lambda.hpp>
using namespace std;
using namespace boost::assign;
using namespace boost::lambda;
int main()
{
vector<int> v = list_of(5)(1)(3)(4)(6)(2); // Nutzung von Boost.Assign (s.o.)
for_each(v.begin(), v.end(), cout << _1 << ' ');
cout << '\n';
sort(v.begin(), v.end(), _1>_2);
for_each(v.begin(), v.end(), cout << _1 << ' ');
cout << '\n';
}
Ausgabe:
5 1 3 4 6 2
6 5 4 3 2 1
2.7 Date-Time
- Boost Date-Time-Library
-
Zeit und Datum sind ein sehr komplexes Thema
- Nicht-eindeutige Tage
- Zeit-Zonen
- Unterschiedliche Kalender
- Schaltjahre und –sekunden
- International unterschiedlicher Darstellung
- Und vieles mehr...
-
Bibliothek ist gut anpaßbar
- Viele Bibliotheken kann man z.B. nicht mehr nutzen, wenn man z.B. eine High-Performance-Auflösung benötigt.
- Daher ist diese Bibliothek auch nicht ganz einfach in der Nutzung
-
Unterstützt u.a.:
- Gregorian Calendar
- Posix Time
- Local Time
- Date Time Input/Output
- Serialization
- Datums- und Zeit-Berechnungen
-
Basiert auf drei Domain-Konzepten:
-
Time Point
- Spezifiziert einen zeitlichen Ort im Zeit-Kontinuum
-
Time Duration
- Eine Zeitdauer, mit keinem Time-Point im Zeit-Kontinuum verbunden
-
Time Interval
- Eine Zeitdauer, mit einem Time-Point im Zeit-Kontinuum verbunden. Wird auch als Zeit-Abschnitt bezeichnet.
-
Time Point
- Die Dokumentation ist für die Komplexität recht knapp
-
Zusätzlich gibt es seit Boost 1.45.0 noch die Bibliothek „Boost.Chrono“
- Überschneidet sich zum Teil mit der Date-Time Lib
- Boost.Chrono ist eine Implementierung eines Teils der neuen C++11 Standard-Bibliothek
-
Achtung – DateTime benötigt bei manchen Features die compilierten Libs
- Keine header-only Lib für die String Anteile
-
Hinweis zum folgenden Beispiel:
- Für eine deutsche Darstellung der Daten müßte man ein entsprechendes Facet "boost::gregorian::date_facet” definieren
// Beispiel 14 - Date-Time
#include <iostream>
#include "boost/date_time/posix_time/posix_time.hpp"
using namespace std;
using namespace boost::posix_time;
using namespace boost::gregorian;
int main()
{
ptime now = second_clock::local_time();
cout << "Jetzt: " << now << '\n';
date today = now.date();
cout << "Heute: " << today << '\n';
date tommorrow = today + days(1);
cout << "Morgen: " << tommorrow << '\n';
date day_after_tom = today + days(2);
cout << "Uebermorgen: " << day_after_tom << '\n';
ptime midnight(tommorrow);
cout << "Mitternacht: " << midnight << '\n';
time_iterator titr(now, hours(1));
for (int i=0; titr<midnight; ++titr)
{
cout << "Jetzt + " << i++ << " h: " << *titr << '\n';
}
time_duration remaining = midnight - now;
cout << "Sie haben noch " << remaining << " Std:Min:Sek bis Mitternacht...\n";
}
Mögliche Ausgabe (nur "möglich" wegen Datum/Zeit-Abhängigkeit):
Jetzt: 2012-Feb-22 17:52:42
Heute: 2012-Feb-22
Morgen: 2012-Feb-23
Uebermorgen: 2012-Feb-24
Mitternacht: 2012-Feb-23 00:00:00
Jetzt + 0 h: 2012-Feb-22 17:52:42
Jetzt + 1 h: 2012-Feb-22 18:52:42
Jetzt + 2 h: 2012-Feb-22 19:52:42
Jetzt + 3 h: 2012-Feb-22 20:52:42
Jetzt + 4 h: 2012-Feb-22 21:52:42
Jetzt + 5 h: 2012-Feb-22 22:52:42
Jetzt + 6 h: 2012-Feb-22 23:52:42
Sie haben noch 06:07:18 Std:Min:Sek bis Mitternacht...
2.8 Random
-
Random Number Generators and Distributions
- Zufalls-Zahlen Generatoren und Benutzung
-
Design
- Ausgelegt auf hohe Flexibilität, Erweiterbarkeit und Anpassbarkeit
- Einfache Benutzung dadurch manchmal aufwändiger als gedacht
-
Design basiert auf den beiden Konzepten:
- Generatoren
- Distributoren
-
Konzept
-
Generatoren erzeugen Reihen von Zufalls-Zahlen
- Entsprechen “rand” und “srand” aus <cstdlib>
- Es kann aber beliebig viele unabhängige Generatoren geben
- Mehrere Generator-Arten bzgl. z.B. der Zyklen-Länge, der Geschwindigkeit oder der Verteilung
- Ein einfacher Generator ist die Klasse “boost::minstd_rand” - benötigt wie “rand” eine Initialisierung in Form eines “unsigned int”
-
Distributoren benutzen Generatoren
- Bilden die Zufalls-Zahlen-Reihe auf ein Verteilungs-Muster ab
- Distributoren lassen sich verschachteln
- Einfache Standard Distribution ist z.B. “boost::uniform_int”, die Integer-Zahlen gleichmäßig in ein Intervall verteilt
-
Hilfsklasse “boost::variate_generator”
- Um einen Generator und eine Distribution einfach zu verbinden
-
Generatoren erzeugen Reihen von Zufalls-Zahlen
- Bestandteil von C++11
-
Benötigt bis auf eine Ausnahme keine compilierte Lib, funktioniert rein mit Headern
- Ausnahme: „random_device”
// Beispiel 15 - Random 1
#include <iostream>
#include <ctime>
#include <boost/random.hpp>
using namespace std;
int main()
{
boost::minstd_rand generator(static_cast<unsigned int>(time(0)));
boost::uniform_int<> distribution(1, 6);
for(int i=0; i<10; ++i)
{
cout << distribution(generator) << ' ';
}
cout << '\n';
}
Mögliche Ausgabe (nur "möglich" wegen Zufallszahlen):
6 1 1 5 5 2 3 4 3 3
// Beispiel 16 - Random 2
#include <iostream>
#include <ctime>
#include <boost/random.hpp>
using namespace std;
using namespace boost;
int main()
{
minstd_rand generator(static_cast<unsigned int>(time(0)));
uniform_int<> distribution(1, 6);
variate_generator<minstd_rand&, uniform_int<>> die(generator, distribution);
for(int i=0; i<10; ++i)
{
cout << die() << ' ';
}
cout << '\n';
}
Mögliche Ausgabe (nur "möglich" wegen Zufallszahlen):
6 3 2 5 6 3 3 3 4 3
2.9 Filesystem
- Boost Filesystem Library
- Dateien, Pfade und Verzeichnisse abfragen und manipulieren
-
Portabel
- Addressiert auch Datei-Systeme mit z.B. nur einer Ebene (wie z.B. Tandom)
- Unterscheidet Single-Root und Multi-Root Datei-Systeme
- uvm.
-
Unterstützt ein Design für semantische Fehler sind Compiler-Fehler
- Z.B. extra Klasse für Pfade statt einfach nur Strings
-
Wird z.B. von Adobe Programmen genutzt
- Die Bibliothek stammt initial von Adobe
-
Achtung – die Schnittstelle wurde mehrfach geändert
- Es gibt mittlerweile die Versionen 1, 2 und 3 mit unterschiedlichen Schnittstellen
-
Gerade zwischen Version 2 und 3 große Änderungen in der Schnittstelle
- Neues Konzept für unterschiedliche Zeichensätze zwischen C++ und OS
Bestandteil des TR2
- Leider nicht Bestandteil von C++ 11
- Wird hoffentlich mit C++1ykommen
- Microsoft Visual Studio Beta 11 unterstützt schon in "std" die Filesystem Lib basierend auf dem aktuellen ISO Vorschlag - siehe z.B. bei Herb Sutter
- Achtung - benötigt die compilierte Lib
// Beispiel 17 - Filesystem
#include <string>
#include <iostream>
#include <boost/filesystem.hpp>
using namespace std;
using namespace boost::filesystem;
int main()
{
directory_iterator it("c:\\");
directory_iterator eit;
for (; it!=eit; ++it)
{
if (is_directory(it->status()))
{
cout << "D: ";
}
else
{
cout << " ";
}
cout << it->path() << '\n';
}
}
Mögliche Ausgabe (nur "möglich" wegen individuellen Dateisystems):
D: "c:\$RECYCLE.BIN"
"c:\Documents and Settings"
"c:\hiberfil.sys"
D: "c:\Intel"
"c:\pagefile.sys"
D: "c:\Program Files"
D: "c:\Recovery"
D: "c:\System Volume Information"
D: "c:\Users"
D: "c:\Windows"
2.10 Regex
- Boost.Regex
- Regular Expressions
-
Drei unterstützte Expression Dialekte:
- ECMAScript (andere Namen: normal, Perl, JavaScript oder JScript)
- POSIX Basic
- POSIX extended
- Bestandteil von C++11
- Kann via ICU Unicode unterstützen
-
Es gibt eine zweite Reg-Expr Lib in Boost: „xpressive“
- Basierend auf Expression Templates
- Reg-Exp Ausdrücke können sich gegenseitig referenzieren
- Achtung - benötigt die compilierte Lib
// Beispiel 18 - Regex
#include <string>
#include <iostream>
#include <boost/regex.hpp>
using namespace std;
using namespace boost;
int main()
{
regex x("Hal{2,}o");
string s0 = "Hao";
string s1 = "Halo";
string s2 = "Hallo";
string s3 = "Halllo";
string s4 = "Hallllo";
cout << s0 << ": " << regex_match(s0, x) << '\n';
cout << s1 << ": " << regex_match(s1, x) << '\n';
cout << s2 << ": " << regex_match(s2, x) << '\n';
cout << s3 << ": " << regex_match(s3, x) << '\n';
cout << s4 << ": " << regex_match(s4, x) << '\n';
}
Ausgabe:
Hao: 0
Halo: 0
Hallo: 1
Halllo: 1
Hallllo: 1
2.11 Serialization
- Boost.Serialization
- Serialisierung eigener Objekte
- Automatische Unterstützung typischer Serialisierungs-Probleme:
- Versionierung
- Zeiger
- Shared-Data
- STL Container
- Vielfältige Archiv-Formate
- Non-Intrusive, d.h. beliebige Typen können serialisiert werden
-
Für XML Dateien werden XML Tags benötigt
- Dazu gibt es "Name-Value Pairs"
-
Makro BOOST_SERIALIZATION_NVP
- Nutzt den Namen der Klassen und Member als Tag-Namen
- Siehe Beispiel "Serialization 3"
- Achtung - benötigt die compilierte Lib
// Beispiel 19 - Serialization 1
#include <fstream>
#include <iostream>
#include <string>
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
using namespace std;
using namespace boost::archive;
class person
{
friend class boost::serialization::access;
public:
person() : size(0) {}
person(const string& n, int s) : name(n), size(s) {}
friend ostream& operator<<(ostream& os, const person& p)
{
return os << p.name << " - " << p.size << " cm";
}
private:
template<class Archive> void serialize(Archive& ar, const unsigned int version)
{
ar & name;
ar & size;
}
string name;
int size;
};
int main()
{
{
const person axel("Axel", 182);
cout << axel << '\n';
ofstream ofs("person.txt");
text_oarchive oa(ofs);
oa << axel;
}
{
person newperson;
ifstream ifs("person.txt", ios::binary);
boost::archive::text_iarchive ia(ifs);
ia >> newperson;
cout << newperson << '\n';
}
}
Ausgabe:
Axel - 182 cm
Axel - 182 cm
Inhalt von Datei "person.txt":
22 serialization::archive 9 0 0 4 Axel 182
// Beispiel 20 - Serialization 2
#include <algorithm>
#include <fstream>
#include <iostream>
#include <string>
#include <vector>
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <boost/serialization/vector.hpp>
using namespace std;
using namespace boost::archive;
class person
{
friend class boost::serialization::access;
public:
person() : size(0) {}
person(const string& n, int s) : name(n), size(s) {}
person(const string& n, int s, const string& m1) : name(n), size(s)
{
mails.push_back(m1);
}
person(const string& n, int s, const string& m1, const string& m2) : name(n), size(s)
{
mails.push_back(m1);
mails.push_back(m2);
}
friend ostream& operator<<(ostream& os, const person& p)
{
os << p.name << " - " << p.size << " cm\n";
for_each(p.mails.cbegin(), p.mails.cend(),
[](const string& adr) { cout << "- " << adr << '\n'; }
);
return os;
}
private:
template<class Archive> void serialize(Archive& ar, const unsigned int version)
{
ar & name;
ar & size;
ar & mails;
}
string name;
int size;
vector<string> mails;
};
int main()
{
{
const person axel("Axel", 182, "axel@axel.de", "ax@test.de");
cout << axel << '\n';
ofstream ofs("person.txt");
text_oarchive oa(ofs);
oa << axel;
}
{
person newperson;
ifstream ifs("person.txt", ios::binary);
boost::archive::text_iarchive ia(ifs);
ia >> newperson;
cout << newperson << '\n';
}
}
Ausgabe:
Axel - 182 cm
- axel@axel.de
- ax@test.de
Axel - 182 cm
- axel@axel.de
- ax@test.de
Inhalt von Datei "person.txt":
22 serialization::archive 9 0 0 4 Axel 182 0 0 2 0 12 axel@axel.de 10 ax@test.de
// Beispiel 21 - Serialization 3
#include <algorithm>
#include <fstream>
#include <iostream>
#include <string>
#include <vector>
#include <boost/archive/xml_iarchive.hpp>
#include <boost/archive/xml_oarchive.hpp>
#include <boost/serialization/vector.hpp>
using namespace std;
using namespace boost::archive;
class person
{
friend class boost::serialization::access;
public:
person() : size(0) {}
person(const string& n, int s) : name(n), size(s) {}
person(const string& n, int s, const string& m1) : name(n), size(s)
{
mails.push_back(m1);
}
person(const string& n, int s, const string& m1, const string& m2) : name(n), size(s)
{
mails.push_back(m1);
mails.push_back(m2);
}
friend ostream& operator<<(ostream& os, const person& p)
{
os << p.name << " - " << p.size << " cm\n";
for_each(p.mails.cbegin(), p.mails.cend(),
[](const string& adr) { cout << "- " << adr << '\n'; }
);
return os;
}
private:
template<class Archive> void serialize(Archive& ar, const unsigned int version)
{
ar & BOOST_SERIALIZATION_NVP(name);
ar & BOOST_SERIALIZATION_NVP(size);
ar & BOOST_SERIALIZATION_NVP(mails);
}
string name;
int size;
vector<string> mails;
};
int main()
{
{
const person axel("Axel", 182, "axel@axel.de", "ax@test.de");
cout << axel << '\n';
ofstream ofs("person.xml.txt");
xml_oarchive oa(ofs);
oa << BOOST_SERIALIZATION_NVP(axel);
}
{
person newperson;
ifstream ifs("person.xml.txt", ios::binary);
boost::archive::xml_iarchive ia(ifs);
ia >> BOOST_SERIALIZATION_NVP(newperson);
cout << newperson << '\n';
}
}
Ausgabe:
Axel - 182 cm
- axel@axel.de
- ax@test.de
Axel - 182 cm
- axel@axel.de
- ax@test.de
Inhalt von Datei "person.xml.txt":
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE boost_serialization>
<boost_serialization signature="serialization::archive" version="9">
<axel class_id="0" tracking_level="0" version="0">
<name>Axel</name>
<size>182</size>
<mails class_id="1" tracking_level="0" version="0">
<count>2</count>
<item_version>0</item_version>
<item>axel@axel.de</item>
<item>ax@test.de</item>
</mails>
</axel>
</boost_serialization>
2.12 Thread
- Boost.Thread
- Portable C++ Multi-Thread Implementierung
-
Spielwiese für die C++11 Thread Standardisierung
- Schnittstelle von Boost.Thread hat sich mehrfach geändert
-
Enthält neben der eigentlichen Thread-Klassen:
- Synchronisations-Elemente (Mutex, Locks, Condition-Variables,…)
-
Futures
- Klassen für asynchrone Ergebnisse
- Achtung - benötigt die compilierte Lib
// Beispiel 22 - Thread
#include <iostream>
#include <boost/thread.hpp>
using namespace std;
void doit(const char* name, int ms)
{
for (int i=0; i<6; ++i)
{
boost::this_thread::sleep(boost::posix_time::millisec(ms));
// Achtung - Ausgabe muesste eigentlich MT geschuetzt sein
// Hier im Beispiel geht es aufgrund der gewaehlten Sleep-Zeiten auch so
cout << name << ": " << i << endl;
}
}
int main()
{
boost::thread t1(doit, "Thread 1", 500);
boost::thread t2(doit, "Thread 2", 1130);
t1.join();
t2.join();
}
Ausgabe:
Thread 1: 0
Thread 1: 1
Thread 2: 0
Thread 1: 2
Thread 1: 3
Thread 2: 1
Thread 1: 4
Thread 1: 5
Thread 2: 2
Thread 2: 3
Thread 2: 4
Thread 2: 5
2.13 Spirit
- Boost.Spirit
-
Parser-Framework
- Schreiben von EBNF direkt in C++
- Effizient dank Expression Templates
- Einfaches Anbinden von Aktoren oder Erzeugung von ASTs
- Benötigt keine compilierte Lib, funktioniert rein mit Headern
- Beispiele:
-
Liste von mit Komma getrennten Integern
- EBNF: int (, int)*
- Spirit: int_ >> *(',' >> int_)
- Beispiel "Spirit 1" überprüft nur, ob der String die Grammatik matcht - keine Aktion
- Beispiel "Spirit 2" mit Aktion: summiert die Int-Zahlen auf
// Beispiel 23 - Spirit 1
#include <iostream>
#include <string>
#include <boost/spirit/include/qi.hpp>
using namespace std;
using boost::spirit::qi::int_;
using boost::spirit::qi::phrase_parse;
using boost::spirit::ascii::space;
int main()
{
string s("1, 2,34 , 17 ");
string::const_iterator it = s.cbegin();
string::const_iterator eit = s.cend();
bool res = phrase_parse(it, eit, int_ >> *(',' >> int_), space);
cout << "res: " << boolalpha << res << endl;
cout << "full: " << boolalpha << (it==eit) << endl;
}
Ausgabe:
res: true
full: true
// Beispiel 24 - Spirit 2
#include <iostream>
#include <string>
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/phoenix_core.hpp>
#include <boost/spirit/include/phoenix_operator.hpp>
using namespace std;
int main()
{
using boost::spirit::qi::_1;
using boost::spirit::qi::int_;
using boost::spirit::qi::phrase_parse;
using boost::spirit::ascii::space;
using boost::phoenix::ref;
string s("1, 2,34 , 17 ");
string::const_iterator it = s.cbegin();
string::const_iterator eit = s.cend();
int n = 0;
bool res = phrase_parse(it, eit, int_[ref(n) = _1] >> *(',' >> int_[ref(n) += _1]), space);
cout << "res: " << boolalpha << res << endl;
cout << "full: " << boolalpha << (it==eit) << endl;
cout << "n: " << n << endl;
}
Ausgabe:
res: true
full: true
n: 54
2.14 Weitere
- Weitere Bibliotheken:
-
Any
- Kann Werte beliebigen Typs aufnehmen
- Beim Herausholen muss der Typ wieder bekannt sein
- Der Typ wird überprüft
- Typsichere Alternative zu "void*" aus C
-
Variant
- Kann Werte bestimmter Typen aufnehmen
- Beim Herausholen muss der Typ wieder bekannt sein
- Der Typ wird überprüft
- Typsichere Alternative zu "unions" aus C
-
Tuple
- Kann mehrere Werte bestimmten Typs aufnehmen
- Erweiterung der Std::Pairs auf beliebige Member-Anzahl
- Bestandteil von C++11
-
Typische Anwendungen:
- Für einfache Hilfsklassen ohne Logik geeignet
- Rückgabe mehrerer Werte aus Funktionen
-
Function
-
Polymorphe Funktions Wrapper
- Kann Funktionen und Funktions-Objekte aufnehmen
- Typen müssen nicht exakt passen solange sie aufrufbar sind
-
Anwendung
- Implementierung von Callbacks
- Transport und Speicherung von Funktionalität
-
Polymorphe Funktions Wrapper
-
Multi-Index
- Container mit mehreren Dimensionen
-
Für jede Dimension kann ein eigener Basis-Container angegeben werden
- Vektor, Liste, Map, Hash,...
-
Beispiel
- Klasse Person in einem Multi-Index Container
- Multi-Map über Vorname, Nachname,...
-
Bimap
- Map-Container mit Key-Value Abbildung in beide Richtungen
-
Quasi zwei Maps in einem Container
- Key in der einen Map ist für die andere Map Value
- Und umgekehrt
-
Asio
- Asynchrones System Input Output
- Netzwerk-Funktionalität
-
Low-Level IO für z.B.:
- Sockets
- Timer
- Hostname Auflösung
- Serielle Ports
- Datei Descriptoren
-
Flyweight
- Implementierung des Fliegengewicht Entwurfsmuster
- Effizientes speichersparendes Handling von vielen oft gleichartigen Objekten
-
Intervall Container Library (ICL)
- Verarbeitung von Intervallen
- Zusammenfassung, Vergleiche, Überlappung, Sortierung
- Beispiel "Zeiträume"
-
Move
- Simulation der C++11 Move Semantik
- Ermöglicht die Implementierung von Move Semantiken für eigene Klassen
-
Signal & Signal2
- Implementierung eines Slot & Callback Mechanismus
- Z.B. für Event-Handling, GUI, usw. nutzbar
- Signal2 ist wie Signal, aber multi-threading fest und header-only
-
Test
- Unit-Test Library
-
Und viele viele mehr
- Beim Vorbereiten bin ich nochmal durch die gesamte Liste gegangen
- Obwohl mir das gar nicht so klar war, habe ich mittlerweile ca. 60% der Boost-Libs mal benutzt
- Trauen Sie sich einfach sie auszuprobieren und zu nutzen - es sind viele Perlen darunter
- Oft sind es die kleinen Bibliotheken, die einem das Leben erleichtern
- Stöbern Sie – es lohnt sich
-
Nehmen Sie sich z.B. vor – jede Woche eine neue Boost Lib kennen lernen
- Dann haben Sie für 2 Jahre zu tun
- Und viele Libs kann man auch in Monaten nicht wirklich erschlagen
- Erfinden Sie das Rad nicht immer neu – selbst wenn Ihres runder ist...
3. Ausblick
-
Akzeptierte neue Bibliotheken:
-
Heap Library
- kommt in Boost 1.49.0 Ende Februar 2012
- Context Library
- Type Traits Library Extension
- Type Traits Introspection Library
- AutoIndex Tool
- Lockfree Library
- Algorithm Extension Library
- Atomic Library
- Local Library
- Constrained Value Library
- GIL.IO Library
-
Heap Library
-
Nicht akzeptierte Bibliotheken, die überarbeitet werden:
- Log Library
- Endian Library
-
Verwaiste Bibliothek
-
Switch library
- Kein Kontakt mit dem Autor möglich
- Provisorisch akzeptiert im Januar 2008
-
Switch library
-
Aktuell im Review:
-
Boost.Predef
- Erweiterung von Boost.Config
- by Rene Riviera
- Review scheduled between Monday, February 20th to February 29th
- Sourcen und Dokumentation: http://tinyurl.com/73n6a3k
-
Boost.Predef
-
Bibliotheken in der Review Queue:
-
Join
- Asynchrone message-basierte Concurrency Lib
- Review Manager gesucht
-
Pimpl
- Implementierung des Pimpl Idioms (auch Body/Handle oder auch Compiler-Firewall genannt)
- Review Manager gesucht
-
Sorting
- 3 spezielle Sortier-Algorithmen mit speziellen Fähigkeiten
- Review Manager gesucht
-
Quaternions, Vectors, Matrices
- Lib um mit Vektoren, Matrizen und Tensoren zu arbeiten
- Review Manager gesucht
-
Variadic Macro Data
- Fügt Variadic-Makros der Boost.Präprozessor Library hinzu
- Review Manager gesucht
-
Block Pointer
- Memory Manager mit konstanter Komplexität für zyklische Strukturen
- Review Manager gesucht
-
Network
- Unterstützung von Netzwerk Protokollen auf Applikations-Ebene
- Review Manager gesucht
-
Singularity
- Direkte Kontrolle der Lebensdauer von Objekten (z.B. für Singletons)
- Review Manager gesucht
-
Join
-
Bibliotheken, an denen zur Zeit entwickelt wird
- 72 Stück, darum führe ich sie nicht auf
- https://svn.boost.org/trac/boost/wiki/LibrariesUnderConstruction
4. Fazit
-
Boost lohnt sich
- Frei & offen
- Hohe Qualität
- Einfach zu nutzen
- Enthält viele Dinge, die das Programmierer-Leben einfacher machen
-
Man kann viel lernen
- Boost Entwickler schreiben kein primitives C++
- Lesen Sie die Mailing-Listen mit
- Gerade die Review Diskussionen sind oft sehr lehrreich
-
Boost ist die wohl wichtigste C++ Bibliothek
- Natürlich erst nach der Standard-Bibliothek
-
C++1y erwartet viel von Boost
- Das C++ Standardisierungs-Gremium traf sich Anfang Februar 2012
-
Größtes Manko von C++11: die viel zu kleine Standard-Bibliothek
- Hieran soll gearbeitet werden
- Boost wird seinen Anteil daran haben (Test- und Spielwiese für Bibliotheken)
- Bjarne Stroustrup: "doubling the output of Boost“
-
TR2 is dead; multiple TR's coming instead
- Es werden viele Library Proposals auf Basis von Boost erwartet
-
Statt einer Library Gruppe soll es nun mehrere Study Groups geben – u.a.:
- SG1: Concurrency and Parallelism (chair: Hans Boehm)
- SG2: Modules (chair: Doug Gregor)
- SG3: File System (chair: Beman Dawes)
- SG4: Networking (chair: Kyle Kloepper)
-
Probleme von Boost;
-
Bibliotheken sind zum Teil nicht einsteiger-geeignet
-
Viele Bibliotheken zielen auf Nicht-Einsteiger-Probleme
- DSEL Erstellung, Meta-Progammierung,...
- Oft ist aber auch die Dokumentation nicht einsteiger-geeignet
-
Viele Bibliotheken zielen auf Nicht-Einsteiger-Probleme
-
Dokumentation
- Oft nur mit Hintergrundwissen lesbar
- Oft zu knapp für Einsteiger
- Kaum Tutorials
- Man muss sich da manchmal durchbeißen…
-
Bibliotheken sind zum Teil nicht einsteiger-geeignet
-
Boost benötigt immer engaierte C++ Entwickler
- Fehlende Review Manager
- Viele Bibliotheken in der Entwicklung
- Viele offene Themen
5. Literatur
-
Eine Einführung in Boost:
- Björn Karlsson
- Beyond the C++ Standard Library
- An Introduction to Boost
- Sprache: English
- Verlag: Addison-Wesley Longman
- ISBN: 978-0321133540
- Erscheinungs-Jahr: August 2005
-
Eine Übersicht über Boost:
- Robert Demming
- Introduction to the Boost C++ Libraries
- Volume I - Foundations
- Sprache: English
- Verlag: Datasim Education Bv
- ISBN: 978-9491028014
- Erscheinungs-Jahr: November 2010
-
Eine Übersicht über Boost:
- Boris Schäling
- The Boost C++ Libraries
- A quickstart introduction with over 250 examples
- Sprache: English
- Verlag: Xml Press
- ISBN: 978-0982219195
- Erscheinungs-Jahr: Juli 2011
-
Quasi Erklärung und Tutorial zur Boost.MPL Bibliothek (Meta-Programming-Library):
- David Abrahams
- C++ Template Metaprogramming
- Concepts, Tools, and Techniques from Boost and Beyond
- Sprache: English
- Verlag: Addison-Wesley Longman
- ISBN: 978-0321227256
- Erscheinungs-Jahr: Dezember 2004
-
Quasi Erklärung und Tutorial zur Boost Graph Bibliothek:
- Jeremy G. Siek
- The Boost Graph Library
- User Guide and Reference Manual
- Sprache: Englisch
- Verlag: Addison-Wesley Longman
- ISBN: 978-0201729146
- Erscheinungs-Jahr: Januar 2002
6. Links
- Homepage von Boost selber:
- Boost Lizenz:
- Übersicht über die Boost-Mailing-Listen:
- Sourcen und Dokumentation zu der zur Zeit im Review befindlichen Bibiliothek Boost.Config:
- In der Entwicklung befindliche Boost Bibliotheken:
-
Boost-Konferenz "C++Now" (ehemals "BoostCon"):
- Neue URL: http://cppnow.org/
- Alte URL: http://boostcon.boost.org/
- C++ Next - Artikel rund um Boost und die Standardisierung von C++:
- Consulting Firma rund um Boost, die im Download Bereich fertig compilierte Boost-Libs für viele Microsoft Compiler anbietet:
- Eine Einführung in Boost in deutscher Sprache von Boris Schäling. Das ist quasi der deutsche Vorgänger zum oben aufgeführten Buch "The Boost C++ Libraries":
- C++ Bibliothek "ICU" für Unicode und Lokalisierungs Themen:
- Das Betriebssystem Haiku:
- Herb Sutters Blog Beitrag über Microsoft Visual Studio Beta 11 mit Filesystem Library:
7. Versions-Historie
Die Versions-Historie dieses Artikels:-
Version 1
- 22.02.2012
- Initiale Version - entspricht dem Vortrag auf dem 3-ten C++ Treffen im Chaosdorf in Düsseldorf.
-
Version 2
- 23.02.2012
- Hinweis von Jens Weller integriert, dass boostpro computing fertig compilierte Microsoft Visual Studio C++ Libs anbietet.
-
Version 3
- 01.03.2011
- Hinweise auf neue Boost Version 1.49.0 vom 24.02.2012 und auf Herb Sutters Blog Beitrag bzgl. Microsoft Visual Studio Beta 11 direkter Unterstützung der Filesystem Library hinzugefügt.
-
Version 4
- 09.03.2012
- Aufgrund des Blog Beitrags von Herb Sutter zum Februar 2012 C++ Standard-Meeting die Hinweise auf den nächsten C++ Standard in C++1y umbenannt.