web-dev-qa-db-de.com

Welche Boost-Funktionen überschneiden sich mit C ++ 11?

Ich habe meine C++ - Kenntnisse vor einigen Jahren ins Regal gestellt und es scheint, dass sich die Landschaft geändert hat, wenn ich sie wieder brauche.

Wir haben jetzt C++ 11 und ich verstehe, dass es viele Boost-Funktionen überlappt.

Gibt es eine Zusammenfassung, wo diese Überlappungen liegen, welche Boost-Bibliotheken zu Legacy werden, welche C++ 11-Funktionen anstelle von Boost-Funktionen empfohlen werden und welche besser nicht?

185
user377178

Durch C++ 11-Sprachfunktionen oder -Bibliotheken ersetzbar

TR1 (sie sind in der Dokumentation markiert, wenn es sich um TR1-Bibliotheken handelt)

Von C++ 11 rückportierte Funktionen:

Durch C++ 17-Sprachfunktionen ersetzbar:

  • String_ref → std :: string_view
  • Dateisystem<Dateisystem> (Dateisystem TS)
  • Optional → std :: optional ( Bibliotheksgrundlagen TS v1 )
  • Any → std :: any (Bibliotheksgrundlagen TS v1)
  • Mathematik/Sonderfunktionen<cmath> ( Special Math IS ), siehe Liste unten
    • beta-Funktion
    • (normal/assoziiert/sphärisch) Legendre-Polynome
    • (normal/assoziiert) Legendre-Polynome
    • Hermite-Polynome
    • Bessel (J/Y/I/K) -Funktionen (Y heißt in C++ Neumann-Funktion)
    • sphärische Bessel (j/y) -Funktionen
    • (unvollständig/vollständig) elliptische Integrale der (ersten/zweiten/dritten Art)
    • Riemannsche Zetafunktion
    • exponentialintegral Ei
  • Variante → std :: variant ( P0088R2 )

Das Standardteam arbeitet noch daran:

Ein großer Teil von MPL kann mithilfe verschiedener Vorlagen verkleinert oder entfernt werden. Einige gebräuchliche Anwendungsfälle von Lexikonform können durch std :: to_string und std :: sto ersetzt werdenX.

Einige Boost-Bibliotheken sind mit C++ 11 verwandt, haben jedoch auch einige weitere Erweiterungen, z. Boost.Functional/Hash enthält hash_combine und verwandte Funktionen, die in C++ 11 nicht enthalten sind. Boost.Chrono hat I/O und Rounding und viele andere Uhren usw., also möchten Sie vielleicht noch einen Blick auf die Boost-Uhren werfen, bevor Sie sie wirklich verwerfen.

278
kennytm

Eigentlich glaube ich nicht, dass die Boost-Bibliotheken zum Vermächtnis werden.

Ja, Sie sollten in der Lage sein, std::type_traits, regex, shared_ptr, unique_ptr, Tuple<>, std::tie, std::begin Anstelle von Boost Typetraits/Utility, Boost Smartpointer, Boost Tuple und Boost Range Libraries, aber in der Praxis sollte es nicht notwendig sein, zu wechseln, es sei denn, Sie verschieben mehr Code auf c ++ 11.

Meiner Erfahrung nach sind die std -Versionen der meisten davon auch etwas weniger eigenwillig. Z.B. AFAICT hat der Standard nicht

  • Perl5 reguläre Ausdrücke
  • call_traits
  • Bestimmte reguläre Schnittstellenelemente (wie bool boost::basic_regex<>::empty()) und andere Schnittstellenunterschiede
    • dies ist umso wichtiger, als die Boost-Oberfläche genau auf Boost Xpressive abgestimmt ist
    • und es spielt sich viel besser mit Boost-String-Algorithmen. Letztere haben offensichtlich (noch) keine Standard Gegenstücke.
  • Vieles rund um TMP (Boost Fusion)
  • Faule, auf Ausdrucksvorlagen basierende Lambdas; Sie haben unvermeidliche Vorteile, da sie können polymorph sein heute im Gegensatz zu C++ 11. Deshalb können sie oft prägnanter sein:

     std::vector<int> v = {1,2,-9,3};
    
     for (auto i : v | filtered(_arg1 >=0))
         std::cout << i << "\n";
    
     // or:
     boost::for_each(v, std::cout << _arg1);
    

    Auf jeden Fall hat dies gegenüber C++ 11-Lambdas (mit nachgestellten Rückgabetypen, expliziter Erfassung und deklarierten Parametern) immer noch einen gewissen Reiz.

Außerdem spielt Boost eine wichtige Rolle, da es die pfadweise Migration von C++ 03 nach C++ 11 und die Integration von C++ 11- und C++ 03-Codebasen erleichtert. Ich denke besonders an

  • Boost Auto (BOOST_AUTO)
  • Boost Utility (boost::result_of<> Und verwandte)
  • Foreach steigern (BOOST_FOREACH)
  • Vergessen Sie nicht: Boost Move - ermöglicht das Schreiben von Klassen mit Verschiebungssemantik mit einer Syntax, die auf C++ 03-Compilern mit Boost 1_48 + - und C++ 11-Compilern gleich gut kompiliert werden kann.

Nur meine 0,02 $

54
sehe