
mp-units - Die Bibliothek für Mengen und Einheiten für C ++ -Die MP-Units-Bibliothek könnte Gegenstand der ISO-Standardisierung für C ++ 29 sein. Mehr dazu finden Sie in den folgenden ISO C ++ - Vorschlägen:
Wir suchen aktiv nach Parteien, die sich für die Förderung der Bibliothek interessieren.
Eine kurze Einführung in die Schnittstellen der Bibliothek und die Begründung für Änderungen in der Version 2.0 der MP-Einheiten wurden von Mateusz Pusz im Detail in der "Kraft von C ++-Vorlagen mit MP-Units: Lehren gelernt und ein neues Bibliotheksdesign" auf der C ++-auf der Sea 2023-Konferenz bereitgestellt.
Eine umfangreiche Projektdokumentation finden Sie auf MP-Einheiten-GitHub-Seiten. Es enthält Installationsanweisungen und ein detailliertes Benutzerhandbuch.
In diesem Projekt wird das vom ISO und BIPM definierte offizielle Metrologievokabular verwendet. Bitte machen Sie sich mit diesen Begriffen vertraut, um die Dokumentation besser zu verstehen und die Kommunikation und Diskussionen im Zusammenhang mit Domänen zu verbessern. In dem "Glossar"-Kapitel unserer Dokumentation finden Sie wichtige projektbezogene Definitionen. Im offiziellen Wortschatz der ISO und BIPM werden noch mehr Begriffe angegeben.
mp-units ist eine mit Kompilierung fähige moderne C ++ -Bibliothek, die eine dimensionale Analyse der Kompilierzeit und die Manipulation von Einheiten/Menge bietet.
Hier ist ein kleines Beispiel für mögliche Operationen:
# 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);Probieren Sie es am Compiler Explorer.
Diese Bibliothek verwendet stark C ++ 20 Merkmale (Konzepte, Klassen als NTTPS, ...). Dank ihm erhält der Benutzer eine leistungsstarke, aber immer noch einfach zu verwendende Schnittstellen, und alle Konvertierungen der Einheiten und dimensionale Analysen können durchgeführt werden, ohne die Laufzeitleistung oder Genauigkeit zu beeinträchtigen. Im folgenden Beispiel finden Sie eine kurze Vorschau der grundlegenden Bibliotheksfunktionen:
# 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
}Probieren Sie es am Compiler Explorer.