web-dev-qa-db-fra.com

Quelles fonctionnalités de Boost se chevauchent avec C ++ 11?

J'ai mis mes compétences en C++ sur le plateau il y a plusieurs années et il semble maintenant que, lorsque j'en ai encore besoin, le paysage a changé.

Nous avons maintenant le C++ 11 et je crois comprendre qu'il recouvre de nombreuses fonctionnalités de Boost.

Existe-t-il un résumé des zones de chevauchement, des bibliothèques Boost qui vont devenir héritées, des recommandations sur les fonctionnalités C++ 11 à utiliser au lieu de celles de Boost et lesquelles de mieux pas?

185
user377178

Remplaçable par des fonctionnalités ou des bibliothèques du langage C++ 11

TR1 (ils sont marqués dans le documentation s'il s'agit de bibliothèques TR1)

Fonctions back-ported from C++ 11:

Remplaçable par les fonctionnalités du langage C++ 17:

  • String_ref → std :: string_view
  • système de fichiers<système de fichiers> (système de fichiers TS)
  • Facultatif → std :: optional ( Library Fundamentals TS v1 )
  • Any → std :: any (Principes de base de la bibliothèque TS v1)
  • Math/Fonctions spéciales<cmath> ( Special Math IS ), voir la liste ci-dessous
    • fonction bêta
    • (polynômes de Legendre normaux/associés/sphériques)
    • Polynômes de Legendre (normaux/associés)
    • Polynômes d'Hermite
    • Fonctions de Bessel (J/Y/I/K) (Y est appelée fonction de Neumann en C++)
    • fonctions de Bessel sphériques (j/y)
    • intégrales elliptiques (incomplètes/complètes) de (premier/deuxième/troisième type)
    • Fonction zeta de Riemann
    • intégrale exponentielle Ei
  • Variant → std :: variant ( P0088R2 )

L’équipe standard y travaille toujours:

Une grande partie de MPL peut être réduite ou supprimée à l'aide de modèles variadiques. Certains cas d'utilisation courants de distribution lexicale peuvent être remplacés par std :: to_string et std :: stoX.

Certaines bibliothèques Boost sont liées à C++ 11 mais ont également d'autres extensions, par exemple. Boost.Functional/Hash contient hash_combine et fonctions connexes non trouvées dans C++ 11, Boost.Chrono a I/O et arrondi et beaucoup d’autres horloges, etc., alors vous voudrez peut-être jeter un coup d’œil sur les boosters avant de les ignorer.

278
kennytm

En fait, je ne pense pas que les bibliothèques boost vont devenir un héritage.

Oui, vous devriez pouvoir utiliser std::type_traits, regex, shared_ptr, unique_ptr, Tuple<>, std::tie, std::begin Au lieu de bibliothèques Boost Typetraits/Utility, Boost Smartpointer, Boost Tuple, Boost Range, mais dans la pratique, il ne devrait pas être réellement nécessaire de "changer" de code, sauf si vous déplacez davantage de votre code vers c ++ 11.

De plus, d'après mon expérience, les versions de std de la plupart d'entre elles ont un peu moins de fonctionnalités. Par exemple. AFAICT le standard ne pas a

  • Perl5 expressions régulières
  • call_traits
  • Certains membres d'interface regex (tels que bool boost::basic_regex<>::empty()) et d'autres différences d'interface
    • cela mord plus car l'interface Boost est parfaitement adaptée à Boost Xpressive
    • et il joue beaucoup plus bien avec les algorithmes de chaîne Boost Évidemment, ces derniers n'ont pas de contreparties standard (encore?)
  • Beaucoup de choses relatives à TMP (Boost Fusion)
  • Lambdas paresseux à base de modèles d'expression; ils ont des avantages inévitables en ce qu'ils peuvent être polymorphes aujourd'hui, par opposition à C++ 11. Par conséquent, ils peuvent souvent être plus succincts:

     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);
    

    Très certainement, cela a encore un certain attrait sur les lambdas C++ 11 (avec les types de retour de fin, la capture explicite et les paramètres déclarés).

De plus, Boost a un rôle important à jouer, qui consiste précisément à faciliter la migration de C++ 03 vers C++ 11 et à intégrer des bases de code C++ 11 et C++ 03. Je pense particulièrement à

  • Boost Auto (BOOST_AUTO)
  • Boost Utility (boost::result_of<> Et connexes)
  • Boost Foreach (BOOST_FOREACH)
  • N'oubliez pas: Boost Move - qui permet d'écrire des classes avec une sémantique de déplacement avec une syntaxe qui compilera également les compilateurs C++ 03 avec les compilateurs Boost 1_48 + et C++ 11.

Juste mon 0,02 $

54
sehe