
mp-units : la biblioteca de cantidades y unidades para C ++La biblioteca MP-Units podría ser el tema de la estandarización ISO para C ++ 29. Se puede encontrar más sobre esto en las siguientes propuestas ISO C ++:
Estamos buscando activamente fiestas interesadas en el juicio de campo de la biblioteca.
Mateusz Pusz proporcionó en detalle una breve introducción a las interfaces de la biblioteca y la justificación de los cambios en la versión 2.0 de las unidades MP-MP : las lecciones aprendidas y un nuevo diseño de la biblioteca "Hablan en la conferencia C ++ en Sea 2023.
Se puede encontrar una extensa documentación del proyecto en las páginas de MP-Units GitHub. Incluye instrucciones de instalación y una guía detallada del usuario.
Este proyecto utiliza el vocabulario oficial de metrología definido por ISO y BIPM. Familiarícese con esos términos para comprender mejor la documentación y mejorar la comunicación y las discusiones relacionadas con el dominio. Puede encontrar definiciones esenciales relacionadas con el proyecto en el capítulo "Glosario" de nuestra documentación. Aún se proporcionan más términos en el vocabulario oficial de ISO y BIPM.
mp-units es una biblioteca C ++ moderna habilitada en tiempo de compilación que proporciona análisis dimensional de tiempo de compilación y manipulación de unidad/cantidad.
Aquí hay un pequeño ejemplo de posibles operaciones:
# include < mp-units/systems/si.h >
using namespace mp_units ;
using namespace mp_units ::si::unit_symbols ;
// simple numeric operations
static_assert ( 10 * km / 2 == 5 * km);
// conversions to common units
static_assert ( 1 * h == 3600 * s);
static_assert ( 1 * km + 1 * m == 1001 * m);
// derived quantities
static_assert ( 1 * km / ( 1 * s) == 1000 * m / s);
static_assert ( 2 * km / h * ( 2 * h) == 4 * km);
static_assert ( 2 * km / ( 2 * km / h) == 1 * h);
static_assert ( 2 * m * ( 3 * m) == 6 * m2);
static_assert ( 10 * km / ( 5 * km) == 2 * one);
static_assert ( 1000 / ( 1 * s) == 1 * kHz);Pruébelo en el Compilador Explorer.
Esta biblioteca usa en gran medida las características de C ++ 20 (conceptos, clases como NTTPS, ...). Gracias a ellos, el usuario obtiene interfaces potentes pero fáciles de usar y todas las conversiones de unidades y el análisis dimensional se pueden realizar sin sacrificar el rendimiento o precisión del tiempo de ejecución. Consulte el siguiente ejemplo para obtener una vista previa rápida de las características básicas de la biblioteca:
# include < mp-units/format.h >
# include < mp-units/ostream.h >
# include < mp-units/systems/international.h >
# include < mp-units/systems/isq.h >
# include < mp-units/systems/si.h >
# include < format >
# include < iomanip >
# include < iostream >
# include < print >
using namespace mp_units ;
constexpr QuantityOf<isq::speed> auto avg_speed (QuantityOf<isq::length> auto d,
QuantityOf<isq::time> auto t)
{
return d / t;
}
int main ()
{
using namespace mp_units ::si::unit_symbols ;
using namespace mp_units ::international::unit_symbols ;
constexpr quantity v1 = 110 * km / h;
constexpr quantity v2 = 70 * mph;
constexpr quantity v3 = avg_speed ( 220 . * isq::distance[km], 2 * h);
constexpr quantity v4 = avg_speed ( isq::distance ( 140 . * mi), 2 * h);
constexpr quantity v5 = v3. in (m / s);
constexpr quantity v6 = value_cast<m / s>(v4);
constexpr quantity v7 = value_cast< int >(v6);
std::cout << v1 << ' n ' ; // 110 km/h
std::cout << std::setw ( 10 ) << std::setfill ( ' * ' ) << v2 << ' n ' ; // ***70 mi/h
std::cout << std::format ( " {:*^10} n " , v3); // *110 km/h*
std::println ( " {:%N in %U of %D} " , v4); // 70 in mi/h of LT⁻¹
std::println ( " {::N[.2f]} " , v5); // 30.56 m/s
std::println ( " {::N[.2f]U[dn]} " , v6); // 31.29 m⋅s⁻¹
std::println ( " {:%N} " , v7); // 31
}Pruébelo en el Compilador Explorer.