c++ - biblioteca - boost library ubuntu
¿Qué funciones de Boost se superponen con C++ 11? (2)
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?
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<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 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 sintaxis que se compilará igualmente bien en los compiladores C ++ 03 con los compiladores Boost 1_48 + y C ++ 11.
Solo mi $ 0.02
Reemplazable por las características del lenguaje C ++ 11 o bibliotecas
- Foreach → basado en rango para
- Functional/Forward → 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
- Thread → <subproceso>, etc. (pero consulte esta pregunta ).
- Typeof → auto, decltype
- Valor inicializado → Inicialización de lista (§8.5.4 / 3)
- Matemáticas / Funciones especiales →
<cmath>
, 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 documentation si son bibliotecas TR1)
- Array → std :: array
- Bind → std :: bind
- Habilitar If → std :: enable_if
- Function → std :: función
- Función de miembro → std :: mem_fn
- Random → <aleatorio>
- Ref → std :: ref, std::cref
- Regex → <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 → <type_traits>
- Unordered → <unordered_set>, <unordered_map>
Características respaldadas desde C ++ 11:
Reemplazable por las características del lenguaje C ++ 17:
- String_ref → std :: string_view
- Filesystem → <filesystem> (sistema de archivos TS)
- Optional → std :: opcional ( Fundamentos de la Biblioteca TS v1 )
- Any → std :: any (Fundamentos de la biblioteca TS v1)
- Matemáticas / Funciones especiales →
<cmath>
( 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
- Variant → P0088R2 :: 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
- Range → Rango TS
- Asio → Networking TS (enchufes 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, 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.