¿Qué funciones de Boost se superponen con C ++ 11?

Puse mis habilidades en C ++ en el estante hace varios años y parece que ahora, cuando los necesito de nuevo, el paisaje ha cambiado.

Ahora tenemos C ++ 11, y tengo entendido que se superpone a muchas funciones de Boost.

¿Hay algún resumen donde se encuentran esas superposiciones, qué bibliotecas de Boost se convertirán en legado, recomendación de qué características de C ++ 11 usar en lugar de las de refuerzo y cuál es mejor que no?

Reemplazable por las características del lenguaje C ++ 11 o bibliotecas

  • Foreach → basado en rango para
  • Funcional / Adelante → Reenvío perfecto (con referencias rvalue , plantillas variadic y std :: forward )
  • En la fábrica de lugar, fábrica de tipo escrito → Reenvío perfecto (al menos para los casos de uso documentados)
  • Lambda → expresión lambda (en casos no polimórficos)
  • Función local → expresión Lambda
  • Min-Max → std :: minmax , std :: minmax_element
  • Ratio → std :: ratio
  • Static Assert → static_assert
  • Subproceso → , etc. (pero consulte esta pregunta ).
  • Typeof → auto, decltype
  • Valor inicializado → Inicialización de lista (§8.5.4 / 3)
  • Matemáticas / Funciones especiales → , consulte la lista a continuación
    • función gamma (tgamma), función de registro gamma (lgamma)
    • funciones de error (erf, erfc)
    • log1p , expm1
    • cbrt , cbrt
    • acosh , asinh , atanh

TR1 (están marcados en la documentación si son bibliotecas TR1)

  • Array → std :: array
  • Bind → std :: bind
  • Habilitar If → std :: enable_if
  • Función → std :: función
  • Función de miembro → std :: mem_fn
  • Aleatorio →
  • Ref → std :: ref, std :: cref
  • Regex →
  • Resultado de → std :: result_of
  • Smart Ptr → std :: unique_ptr, std :: shared_ptr, std :: weak_ptr (pero boost :: intrusive_ptr aún no puede ser reemplazado)
  • Swap (intercambio de matrices) → std :: swap
  • Tuple → std :: tuple
  • Escriba los rasgos →
  • Desordenado → ,

Características respaldadas desde C ++ 11:

  • Atomic ← std :: atomic
  • Crono ← (ver abajo)
  • Mover ← Referencias de valores

Reemplazable por las características del lenguaje C ++ 17:

  • String_ref → std :: string_view
  • Sistema de archivos → (sistema de archivos TS)
  • Opcional → std :: opcional ( Fundamentos de la Biblioteca TS v1 )
  • Any → std :: any (Fundamentos de la biblioteca TS v1)
  • Matemáticas / Funciones especiales → ( Special Math IS ), consulte la lista a continuación
    • función beta
    • (normal / asociado / esférico) polinomios de Legendre
    • (normal / asociado) polinomios de Legendre
    • Polinomios de Hermite
    • Funciones de Bessel (J / Y / I / K) (Y se llama función de Neumann en C ++)
    • funciones esféricas de Bessel (j / y)
    • integrales elípticas (incompletas / completas) de (primer / segundo / tercer tipo)
    • Función zeta de Riemann
    • Ei integral exponencial
  • Variante → estándar :: variante ( P0088R2 )

El equipo estándar todavía está trabajando en ello:

  • Factor común de matemáticas → std :: experimetal :: gcd, lcm (Fundamentos de la biblioteca TS v2)
  • Verificación de concepto → Conceptos TS
  • Rango → Rango TS
  • Asio → Networking TS (sockets y temporizadores solamente)
  • Multiprecision → Numerics TS
  • Coroutine / Coroutine2 → Coroutines TS

Una gran parte de MPL se puede recortar o eliminar utilizando plantillas variadic. Algunos casos de uso común de yeso léxico se pueden reemplazar por std :: to_string y std :: sto X.

Algunas bibliotecas de Boost están relacionadas con C ++ 11 pero también tienen algunas extensiones más, por ejemplo, Boost.Functional / Hash contiene hash_combine y funciones relacionadas que no se encuentran en C ++ 11, Boost.Chrono tiene E / S y redondeo y muchos otros relojes, etc. por lo que es posible que aún desee echar un vistazo a los impulsores antes de realmente descartarlos.

En realidad, no creo que las bibliotecas de impulso se conviertan en legado.

Sí, debería poder usar std::type_traits , regex , shared_ptr , unique_ptr , tuple<> , std::tie , std::begin lugar de Boost Typetraits / Utility, Boost Smartpointer, Boost Tuple, Boost Range libraries, pero en la práctica, no debería haber ninguna necesidad real de ‘cambiar’ a menos que esté moviendo más de su código a c ++ 11.

Además, en mi experiencia, las versiones std de la mayoría de estos son algo menos funcional. Por ejemplo, AFAICT el estándar no tiene

  • Perl5 expresiones regulares
  • call_traits
  • Ciertos miembros de interfaz regex (como bool boost::basic_regex<>::empty() ) y otras diferencias de interfaz
    • esto pica más ya que la interfaz de Boost coincide exactamente con Boost Xpressive
    • y juega mucho mejor con Algoritmos Boost String. Obviamente, estos últimos no tienen contrapartidas estándar (¿todavía?)
  • Muchas cosas relacionadas con TMP (Boost Fusion)
  • Lazy, expresión basada en plantillas lambdas; tienen beneficios inevitables en el sentido de que pueden ser polimórficos en la actualidad , a diferencia de C ++ 11. Por lo tanto, a menudo pueden ser más sucintos:

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

    Definitivamente, esto todavía tiene cierto atractivo sobre C ++ 11 lambdas (con tipos de retorno final, captura explícita y parámetros declarados).

Además, hay una función GRANDE para Boost, precisamente para facilitar la migración de C ++ 03 a C ++ 11 e integrar bases de código C ++ 11 y C ++ 03. Estoy particularmente pensando en

  • Boost Auto (BOOST_AUTO)
  • Boost Utility ( boost::result_of<> y relacionado)
  • Boost Foreach (BOOST_FOREACH)
  • No olvide: Boost Move, que permite escribir clases con semántica de movimiento con una syntax que se comstackrá igualmente bien en los comstackdores C ++ 03 con los comstackdores Boost 1_48 + y C ++ 11.

Solo mi $ 0.02