¿Qué características de Boost se superponen con C ++ 11?

191

Puse mis habilidades en C ++ en el estante hace varios años y parece que ahora, cuando las necesito nuevamente, el panorama ha cambiado.

Tenemos C ++ 11 ahora, y entiendo que se superpone a muchas características de Boost.

¿Hay algún resumen de dónde se encuentran esas superposiciones, qué bibliotecas de Boost se convertirán en heredadas, la recomendación de qué características de C ++ 11 usar en lugar de impulsar y cuáles mejor no?

usuario377178
fuente
44
Boost fue uno de los primeros en implementar la biblioteca TR1. Dado que ahora está en el estándar, debería preferir la versión estándar. Boost.Lambda también se reemplaza por lambdas reales ahora.
Kerrek SB
66
El artículo de Wikipedia sobre C ++ 11 tiene un buen resumen de la mayoría de los cambios.
Algún tipo programador el

Respuestas:

285

Reemplazable por funciones o bibliotecas de lenguaje C ++ 11

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

Características portadas desde C ++ 11:

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

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

Una gran parte de MPL se puede recortar o eliminar usando plantillas variadas. Algunos casos de uso común de fundición léxico pueden ser reemplazados 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 desee echar un vistazo a los impulsores antes de descartarlos realmente.

kennytm
fuente
1
Agregue a la lista Boost.Chrono , Boost.Exception y Boost.Swap .
ildjarn
9
Tenga en cuenta que Boost.Lambda (o más bien, Boost.Phoenix 'lambdas), todavía son útiles para lambdas polimórficas.
Xeo
2
Buena lista, aunque no creo que std::unique_ptrsea ​​parte de TR1 (ya que requiere semántica de movimiento)
Nemo
1
@ildjarn: Boost.Chrono proporciona muchas más funciones que <chrono>. Boost.Exception: solo N2179 es relevante.
kennytm
2
@Nemo: sí. Solo std :: tr1 :: shared_ptr es parte de TR1, y const std :: unique_ptr reemplaza los casos de uso de boost :: scoped_ptr y boost :: scoped_array
kennytm
55

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

Sí, usted debería ser capaz de utilizar std::type_traits, regex, shared_ptr, unique_ptr, tuple<>, std::tie, std::beginen lugar de Typetraits Boost / Utilidad, Boost SmartPointer, Boost Tuple, Boost bibliotecas Range, pero no debe ser en la práctica hay necesidad real de 'interruptor' a menos que se están moviendo más de su código para c ++ 11.

Además, en mi experiencia, las stdversiones de la mayoría de estas son algo menos características. Por ejemplo, AFAICT el estándar no tiene

  • Perl5 expresiones regulares
  • call_traits
  • Ciertos miembros de la interfaz regex (como bool boost::basic_regex<>::empty()) y otras diferencias de interfaz
    • esto muerde más ya que la interfaz de Boost coincide exactamente con Boost Xpressive
    • y juega mucho mejor con Algoritmos de cadena de refuerzo Obviamente, este último no tiene contrapartes estándar (¿todavía?)
  • Muchas cosas relacionadas con TMP (Boost Fusion)
  • Perezoso, expresión lambdas basada en plantillas; tienen beneficios inevitables, ya que pueden ser polimórficos hoy , a diferencia de C ++ 11. Por lo tanto, a menudo pueden ser más concisos:

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

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

Además, Boost tiene una función GRANDE, precisamente al facilitar la migración por ruta de C ++ 03 a C ++ 11 e integrar las bases de código de C ++ 11 y C ++ 03. Estoy pensando particularmente 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 sintaxis que se compilará igualmente bien en compiladores C ++ 03 con compiladores Boost 1_48 + y C ++ 11.

Solo mis $ 0.02

sehe
fuente