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

191

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

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

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

user377178
quelle
4
Boost war einer der ersten, der die TR1-Bibliothek implementiert hat. Da dies jetzt im Standard enthalten ist, sollten Sie die Standardversion bevorzugen. Boost.Lambda wird jetzt auch durch echte Lambdas ersetzt.
Kerrek SB
6
Der Wikipedia- Artikel zu C ++ 11 enthält eine gute Zusammenfassung der meisten Änderungen.
Einige Programmierer Typ

Antworten:

285

Ersetzbar durch C ++ 11-Sprachfunktionen oder -Bibliotheken

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

Von C ++ 11 rückportierte Funktionen:

Ersetzbar durch C ++ 17-Sprachfunktionen:

  • String_ref → std :: string_view
  • Dateisystem<Dateisystem> (Dateisystem TS)
  • Optional → std :: optional ( Bibliotheksgrundlagen TS v1 )
  • Beliebig → std :: any (Grundlagen der Bibliothek TS v1)
  • Mathematik / Sonderfunktionen<cmath>( Sondermathematik IS ), siehe folgende Liste
    • Beta-Funktion
    • (normal / assoziiert / sphärisch) Legendre-Polynome
    • (normal / assoziiert) Legendre-Polynome
    • Einsiedlerpolynome
    • Bessel-Funktionen (J / Y / I / K) (Y wird in C ++ als Neumann-Funktion bezeichnet)
    • sphärische Bessel (j / y) -Funktionen
    • (unvollständige / vollständige) elliptische Integrale (erste / zweite / dritte Art)
    • Riemannsche Zetafunktion
    • Exponentialintegral Ei
  • Variante → std :: Variante ( P0088R2 )

Das Standardteam arbeitet noch daran:

Ein großer Teil der MPL kann mithilfe verschiedener Vorlagen gekürzt oder entfernt werden. Einige häufige Anwendungsfälle von Lexical Cast können durch std :: to_string und std :: sto X ersetzt werden .

Einige Boost-Bibliotheken beziehen sich auf C ++ 11, haben aber auch einige weitere Erweiterungen, z. B. Boost.Functional / Hash enthält hash_combine und verwandte Funktionen, die in C ++ 11 nicht enthalten sind. Boost.Chrono verfügt über E / A und Rundungen und viele andere Uhren. usw. Vielleicht möchten Sie sich trotzdem die Boost-Modelle ansehen, bevor Sie sie wirklich entlassen.

kennytm
quelle
9
Beachten Sie, dass Boost.Lambda (oder besser Boost.Phoenix 'Lambdas) für polymorphe Lambdas immer noch nützlich sind.
Xeo
2
Schöne Liste, obwohl ich nicht glaube, dass sie std::unique_ptrTeil von TR1 ist (da es Bewegungssemantik erfordert)
Nemo
1
@ildjarn: Boost.Chrono bietet viel mehr Funktionen als <chrono>. Boost.Exception - nur N2179 ist relevant.
Kennytm
2
@Nemo: Ja. Nur std :: tr1 :: shared_ptr ist Teil von TR1, und const std :: unique_ptr ersetzt die Anwendungsfälle von boost :: scoped_ptr und boost :: scoped_array
kennytm
55

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

Ja, sollten Sie in der Lage sein zu verwenden std::type_traits, regex, shared_ptr, unique_ptr, tuple<>, std::tie, std::beginstatt Boost - Typetraits / Utility, Intelligenter Zeiger Boost Boost - Tuple, Boost - Bereich Bibliotheken, aber es in der Praxis keine wirkliche Notwendigkeit zu ‚Schaltern‘ sollen , wenn Sie mehr bewegen Ihr Code zu c ++ 11.

stdNach meiner Erfahrung sind die Versionen der meisten davon etwas weniger funktionsfähig. ZB AFAICT der Standard nicht nicht haben

  • Perl5 reguläre Ausdrücke
  • call_traits
  • Bestimmte Regex-Schnittstellenelemente (z. B. bool boost::basic_regex<>::empty()) und andere Schnittstellenunterschiede
    • Dies ist noch schlimmer, da die Boost-Oberfläche genau auf Boost Xpressive abgestimmt ist
    • und es spielt sich viel besser mit Boost-String-Algorithmen. Offensichtlich haben letztere (noch?) keine Standard- Gegenstücke.
  • Viele Dinge im Zusammenhang mit TMP (Boost Fusion)
  • Faule, auf Ausdrucksvorlagen basierende Lambdas; Sie haben unvermeidliche Vorteile, da sie heute im Gegensatz zu C ++ 11 polymorph sein können . Daher 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 nachfolgenden Rückgabetypen, expliziter Erfassung und deklarierten Parametern) immer noch einen gewissen Reiz.

Außerdem hat Boost eine GROSSE Rolle, gerade bei der Erleichterung der pfadweisen Migration von C ++ 03 nach C ++ 11 und der Integration von C ++ 11- und C ++ 03-Codebasen. Ich denke besonders an

  • Boost Auto (BOOST_AUTO)
  • Boost Utility ( boost::result_of<>und verwandte)
  • Boosten Sie Foreach (BOOST_FOREACH)
  • Vergessen Sie nicht: Boost Move - Dies 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

sehe sehen
quelle