- 



Une bibliothèque C ++ en tête unique qui fournit des littéraux de sécurité et des littéraux définis par les utilisateurs pour la gestion des valeurs physiques définies dans le système international d'unités régulées par le Bureau international des poids et mesures (BIPM) et publié dans la brochure SI. Pour un démarrage rapide, consultez le guide d'installation. Les contributions et les commentaires sont les bienvenus, veuillez consulter les directives de contribution pour plus d'informations.
Un exemple illustratif:
# include < SI/electric_charge.h >
# include < SI/mass.h >
using namespace SI ::literals ;
constexpr auto one_kilogram = 1 .0_kg;
constexpr auto ten_coulomb = 5 .0_A * 2 .0_s;
constexpr auto half_an_ampere = ten_coulomb / 20 .0_s;
constexpr auto thousand_grams = one_kilogram.as<SI:: gram_t >();
void calculate_mass ( const SI:: kilo_gram_t < long double > &kg) {
// do something meaningful here
}
int main ( int , char **) {
calculate_mass (one_kilogram);
return 0 ;
} SI fournit des conversions et des opérations arithmétiques avec des valeurs de l'un des systèmes internationaux d'unités avec une forte sécurité de type au moment de la compilation . Toutes les unités sont des types spéciaux du modèle struct SI::unit_t . Seule la valeur de l'unité est stockée en interne, le rapport (IE Milli, Micro, Kilo ...) est déterminé comme un trait de type pour permettre à toutes les unités d'avoir la même résolution sur l'ensemble des rapports implémentés. SI gère les opérations d'unités des mêmes rapports ainsi que lorsque les rapports sont différents. Voir les détails de mise en œuvre de la documentation pour plus d'informations. Les opérations entre les unités du même rapport sont sans frais, sinon il y a un coût de calcul supplémentaire pour ajuster les valeurs aux unités. Le passage de l'indicateur SI_DISABLE_IMPLICIT_RATIO_CONVERSION à la conversion du rapport implicite du compilateur n'est pas effectué et échoue avec une erreur du compilateur. Voir les résultats de référence continus pour une comparaison entre les mesures de référence et la mise en œuvre dans Si.
Il est possible de fournir des ratios personnalisés aux types intégrés et ils sont entièrement compatibles pour le calcul avec d'autres unités. Cependant, les littéraux ou les typedes nécessaires doivent être fournis par l'utilisateur. Par exemple SI::velocity_t<double, std::ratio<1000, 36>> serait "kilomètre par un centième de l'heure".
La conversion entre les unités est effectuée avec la fonction membre as<unit_t>() de unit_ ou de la fonction libre SI::unit_cast<unit_t>(unit_t u) . Cela convertira une valeur du même type mais un rapport différent.
Pour chaque unité, les littéraux disponibles sont les ratios implémentés préfixés avec un soulignement. c'est-à-dire _mm . _km . Généralement, les ratios suivent les préfixes métriques du système international d'unités que les typedes sont préfixées (ou dans de rares cas interfixés) avec les préfixes métriques standard. IE metre_t, milli_metre_t, kilo_metre_t . Le préfixe ou l'interfixe est marqué d'un * dans les tableaux ci-dessous. Les unités qui ont défini les typedes et les littéraux peuvent être converties en chaînes à l'aide d'opérateurs de flux ou de la fonction SI::to_string . Pour utiliser les opérateurs de flux, incluez le fichier d'en-tête SI/stream.h
| Unité | Symbole de dimension | Symbole d'unité | Ratios implémentés | Unit Typedefs |
|---|---|---|---|---|
| Longueur | L | m | 10 -18 à 10 18 | *_metre_t |
| Temps | T | s | 10 -18 à 10 0 et 60/1, 3600/1 | *_seconds_t, minutes_t, hours_t |
| Masse* | M | kg | 10 -15 à 10 18 | *_gram_t , *_ton_t |
| Courant électrique | je | UN | 10 -18 à 10 18 | *_ampere_t |
| Température thermodynamique ** | t | K | 10 -18 à 10 18 | *_kelvin_t |
| Quantité de substance | N | mol | 10 -18 à 10 18 | *_mol_t |
| Luminosité | J | CD | 10 -18 à 10 18 | *_candela_t |
* Pour la masse, le rapport de base est kg (pas g ) tel que défini dans la table unitaire SI. Il y a donc un décalage entre le préfixe littéral et la représentation interne.
** Le symbole de dimension pour la température thermodynamique doit être Θ (Theta) , mais l'implémentation actuelle ne permet pas les symboles non ASCII ou les symboles multi-charge
| Unité | Symbole de dimension | Exposant | Symbole d'unité | Ratios implémentés | Unit Typedefs |
|---|---|---|---|---|---|
| Zone | L | 2 | M2 | 10 -18 à 10 18 | square_*_metre_t |
| Volume | L | 3 | M3 | 10 -18 à 10 18 | cubic_*_metre_t |
| Fréquence | T | -1 | HZ | 10 -18 à 10 18 | *_hertz_t |
| Angle* | r | 1 | rad | 10 -18 à 1 | *_radian_t |
| Angle (degrés) * | r | 1 | degrés | Micro, Milli, 1 | *_radian_t |
| Angle solide * | R | 1 | SR | 10 -18 à 1 | *_steradian_t |
* L'angle, l'angle (degré) et l'angle solide sont des conteneurs simples, ne contenant aucune fonctionnalité pour faire un calcul angle / angle solide comme un débordement après 2 * pi. La conversion entre long doubles radians et le degré pourrait perdre précis
Toutes les unités qui peuvent être construites à partir d'autres unités se décomposent aux unités respectives en inversant le fonctionnement mathématique. C'est-à-dire si Q = I * T alors Q / I = T et Q / T = I
| Unité | Symbole de dimension | Symbole d'unité | construit à partir de | littéraux mis en œuvre | Unit Typedefs |
|---|---|---|---|---|---|
| Vitesse | V | MS | L / T | m_p_s , km_p_h , _c | metre_per_second_t , kilometre_per_second_t , speed_of_light_t |
| Accélération | un | m / s ^ 2 | v / t, v ^ 2 / l | aucun | aucun |
| Charge électrique | Q | C | IL | AC à EC | *_coulomb_t |
| Potentiel électrique | U | V | P / i, e / q | av à ev | *_volt_t |
| Résistance électrique | O * | Ohm (ω) | U / i, 1 / g | AOHM à EOHM | *_ohm_t |
| Conductance électrique | G | S | I / u, 1 / r | Quant à es | *_siemens_t |
| Capacité électrique | C | F | Q / U | af à ef | *_farad_t |
| Forcer | F | N | M * A | un à en | *_newton_t |
| Pression | p | Pennsylvanie | F / l ^ 2 | apa à l'EPA | *_pascal_t |
| Énergie | E | J | F * l, p * l ^ 3 | aj à ej | *_joule_t |
| Pouvoir | P | W | E / T | aw à ew | *_watt_t |
| Flux magnétique | f * | WB | U * t | AWB à EWB | *_weber_t |
| Champ magnétique | B | T | f / l ^ 2 | à ET | *_tesla_t |
| Élan | o * | kg⋅m / s | M * V | aucun | aucun |
| Inductance | l | H | f / i | ah à hein | *_henry_t |
| Flux lumineux | m * | LM | J * r | Alm à l'orme | *_lumen_t |
| Luminance | je* | lx | M / A | Alx à ELX | *_lux_t |
| Radioactivité | UN | Bq | ABQ à EBQ | *_becquerel_t | |
| Dose absorbée | D | Gym baser | Agy à Egy | *_gray_t | |
| Dose équivalente | H | SV | ASV à ESV | *_sievert_t | |
| Activité catalytique | K | kat | N / t | akat à ekat | *_katal_t |
| Débit de surface | s | m ^ 2 / s | L ^ 2 / t | aucun | |
| Débit volumétrique | V | m ^ 3 / s | L ^ 3 / t | aucun | |
| Fréquence angulaire | w * | rad / s | r / t | aucun |
* Ces dimensions n'ont pas encore les symboles corrects, car l'implémentation actuelle ne permet pas les symboles non ASCII ou les symboles multi-char. Le symbole de dimension pour la résistance électrique doit être Ω (Ohm) et pour le flux magnétique Φ (Phi) . La luminance doit être e b . La vitesse angulaire doit être ω (oméga). Le flux lumineux doit être φ V qui est encore moins pris en charge que Φ (Phi) lui-même.
Les unités non standard ne sont pas réglementées par le BIPM mais sont acceptées pour une utilisation avec la norme SI.
| Unité | Symbole de dimension | littéraux | Ratios implémentés | Unit Typedefs |
|---|---|---|---|---|
| Unités astronomiques de longueur | L | AU, Ly, PC | 149597870691: 1 (Au), 946073077119564: 1 (Ly), 30856775814913700: 1 (PC) | astronomic_unit_t ( _AU ), lightyear_t ( _ly ), parsec_t ( _pc ) |
SI est une bibliothèque d'en-tête uniquement qui utilise des fonctionnalités C ++ 17 . Le bâtiment est testé à l'aide de Cmake> 3.23 et vérifié pour G ++ 7, G ++ 8, Clang5, Clang6, Clang7, MSVC 19 et Appleclang 10.0. Je recommande d'utiliser Conan 2.0 pour télécharger toutes les dépendances pour les tests, mais je peux être utilisé sans lui, si les tests ne sont pas construits.
SI utilise le générateur CMakeps de Conan pour trouver des dépendances. Pour installer les dépendances à utiliser
conan install . --output-folder=build --build=missing --settings=build_type=Debug substituter --settings=build_type=Debug avec --settings=build_type=Release pour basculer entre les builds de débogage et de libération.
En utilisant le générateur CMakeps, vous pouvez soit construire manuellement, soit utiliser les préréglages CMake fournis.
cmake --preset=ci-ninja-debug
cmake --build build L'emplacement d'installation par défaut pour SI est /usr/local/lib/SI . Si peut être installé à l'aide de Cmake brut, CPACK (CMAKES Package Mécanisme), ou en tant que package Conan.io fourni par Conan Center
Voir le guide d'installation pour des instructions détaillées
Remarque: Obtenir Si en tant que package Conan est préféré.
Pour installer avec Cmake's FetchContent, ajoutez ce qui suit à votre CMakelists.txt
include (FetchContent)
FetchContent_Declare(
SI
GIT_REPOSITORY https://gitlab.com/bernedom/SI.git
# This will get the latest version
# To pin to a specific version or hash, add the version/hash here instead
# (e.g. 2.5.1 or 63b267211a6f256f7ba8d5a26e17138bbcf95ba8)
GIT_TAG main
)
FetchContent_MakeAvailable(SI)
# ...
# Link the library to your target. Change this as needed!
target_link_libraries ( ${PROJECT_NAME} PUBLIC SI::SI)SI est disponible en téléchargement «brut» à partir de ce référentiel mais aussi en tant que package Conan. Obtenir Si de Conan-Center est le moyen préféré.
Pour plus d'informations et des détails techniques plus profonds, reportez-vous au document des détails de l'implémentation
Les versions supérieures à 2.0.0 ne seront pas entièrement compatibles avec les versions plus anciennes en raison des modifications de rupture mentionnées dans le Changelog. De la version 2.0.0 sur le package Conan est nommée en bas de cas si se conformer à la convention de dénomination de Conan.