- 



仅标头C ++库,可提供类型安全性和用户定义的文字,以处理由国际重量与措施局(BIPM)监管的国际单位系统定义的物理价值(BIPM)(BIPM),并在SI小册子中出版。有关快速启动,请参阅“安装指南”。欢迎贡献和评论,请检查贡献指南以获取更多信息。
一个说明性的例子:
# 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提供了转换和算术操作,并具有在编译时具有强大安全性的任何国际单元系统的值。所有单元均为模板struct SI::unit_t的特殊打字。仅在内部存储该单元的值,该比率(即milli,micro,kilo ...)被确定为类型特征,以允许所有单元在整个实施比率上具有相同的分辨率。 SI处理相同比率的单位操作以及比率不同的何时。有关更多信息,请参见文档实施详细信息。相同比率单位之间的操作是无额外费用的,否则还有一个额外的计算成本来调整单位的值。将标志SI_DISABLE_IMPLICIT_RATIO_CONVERSION传递到编译器隐式比率转换尚未完成,并且在编译器错误时失败。请参阅参考测量结果与SI中的实现之间的连续基准结果。
可以提供与内置类型的自定义比率,并且它们与其他单元完全兼容。但是,用户必须提供必要的文字或类型。例如SI::velocity_t<double, std::ratio<1000, 36>>将是“公里每百分之一十分之一的时间”。
单位之间的转换是使用unit_的as<unit_t>()成员函数完成的,或者是免费函数SI::unit_cast<unit_t>(unit_t u) 。这将转换相同类型的值,但比率不同。
对于每个单元,可用的文字是以下划线为前缀的实现比率。即_mm 。 _km 。通常,与标准度量前缀相结合(或在极少数情况下)的TYPEDEF与国际单位系统的度量前缀相结合。 ie metre_t, milli_metre_t, kilo_metre_t 。前缀或插子在下表中标有* 。可以使用流操作员或SI::to_string函数将定义打字和文字的单元转换为字符串。要使用流操作员,请包括标题文件SI/stream.h
| 单元 | 维符号 | 单位符号 | 实施比率 | 单位Typedefs |
|---|---|---|---|---|
| 长度 | l | m | 10 -18至10 18 | *_metre_t |
| 时间 | t | s | 10 -18至10 0和60/1,3600/1 | *_seconds_t, minutes_t, hours_t |
| 大量的* | m | 公斤 | 10 -15至10 18 | *_gram_t , *_ton_t |
| 电流 | 我 | 一个 | 10 -18至10 18 | *_ampere_t |
| 热力学温度** | t | k | 10 -18至10 18 | *_kelvin_t |
| 物质量 | n | 摩尔 | 10 -18至10 18 | *_mol_t |
| 亮度 | j | 光盘 | 10 -18至10 18 | *_candela_t |
*对于质量,基本比为kg (不是g ),如SI单位表中所定义的。因此,文字前缀和内部表示之间存在不匹配。
**热力学温度的尺寸符号应为Θ (Theta) ,但是当前的实现不允许非ASCII符号或多char符号
| 单元 | 维符号 | 指数 | 单位符号 | 实施比率 | 单位Typedefs |
|---|---|---|---|---|---|
| 区域 | l | 2 | M2 | 10 -18至10 18 | square_*_metre_t |
| 体积 | l | 3 | M3 | 10 -18至10 18 | cubic_*_metre_t |
| 频率 | t | -1 | 赫兹 | 10 -18至10 18 | *_hertz_t |
| 角度* | r | 1 | rad | 10 -18至1 | *_radian_t |
| 角度(度)** | r | 1 | 度 | Micro,Milli,1 | *_radian_t |
| 结合角* | r | 1 | Sr | 10 -18至1 | *_steradian_t |
*角度,角度(程度)和实体角度是简单的容器,不包含执行角度/固体角度计算的任何功能,例如2* pi后的溢出。弧度和学位之间的转换可能会失去精确度,尤其是在long doubles工作的情况下,因为比率不够精确,因为必须将它们表示为长时间的ints
通过颠倒数学操作,可以从其他单位衰减到各个单元的所有单元。 IE如果Q = I * T则Q / I = T and Q / T = I
| 单元 | 维符号 | 单位符号 | 可从 | 实施文字 | 单位Typedefs |
|---|---|---|---|---|---|
| 速度 | v | 多发性硬化症 | l / t | m_p_s , km_p_h , _c | metre_per_second_t , kilometre_per_second_t , speed_of_light_t |
| 加速度 | 一个 | m/s^2 | v / t,v^2 / l | 没有任何 | 没有任何 |
| 电荷 | 问 | c | 它 | AC到EC | *_coulomb_t |
| 电位 | 你 | v | p / i,e / q | AV到EV | *_volt_t |
| 电阻 | o* | 欧姆(ω) | u / i,1 / g | aohm到eohm | *_ohm_t |
| 电导 | g | s | 我 / u,1 / r | 至于es | *_siemens_t |
| 电容 | c | f | 问 / u | AF到EF | *_farad_t |
| 力量 | f | n | m * a | an | *_newton_t |
| 压力 | p | PA | f / l^2 | APA到EPA | *_pascal_t |
| 活力 | e | j | f * l,p * l^3 | AJ到EJ | *_joule_t |
| 力量 | p | w | E/t | 噢,到ew | *_watt_t |
| 磁通量 | F* | WB | u * t | AWB到EWB | *_weber_t |
| 磁场 | b | t | f/l^2 | 在ET | *_tesla_t |
| 势头 | o* | kg·m/s | m * v | 没有任何 | 没有任何 |
| 电感 | l | h | f / i | 啊,嗯 | *_henry_t |
| 发光的通量 | M* | LM | j * r | alm到榆树 | *_lumen_t |
| 亮度 | 我* | Lx | m / a | alx到麋鹿 | *_lux_t |
| 放射性 | 一个 | BQ | ABQ到EBQ | *_becquerel_t | |
| 吸收剂量 | d | Gy | 对埃及 | *_gray_t | |
| 等效剂量 | h | SV | ASV到ESV | *_sievert_t | |
| 催化活性 | k | 凯特 | n / t | Akat到Ekat | *_katal_t |
| 表面流 | s | m^2/s | l^2 / t | 没有任何 | |
| 体积流量 | v | m^3/s | l^3 / t | 没有任何 | |
| 角频率 | W* | rad/s | r / t | 没有任何 |
*这些维度尚未具有正确的符号,因为当前的实现不允许非ASCII符号或多char符号。电阻的尺寸符号应为Ω (Ohm)和磁通量Φ (Phi) 。亮度应为b 。角速度应为ω(欧米茄)。发光通量应为φV ,其支撑甚至比Φ (Phi)本身更少。
非标准单元不受BIPM的调节,而是接受SI标准的使用。
| 单元 | 维符号 | 文字 | 实施比率 | 单位Typedefs |
|---|---|---|---|---|
| 长度的天文单位 | l | au,ly,pc | 149597870691:1(AU),94607307777119564:1(LY),30856775814913700:1(PC) | astronomic_unit_t ( _AU ), lightyear_t ( _ly ), parsec_t ( _pc ) |
SI是使用C ++ 17功能的仅标题库。使用Cmake> 3.23对建筑物进行了测试,并针对G ++ 7,G ++ 8,Clang5,Clang6,Clang6,Clang7,MSVC 19和Appleclang 10.0进行了验证。我建议使用Conan 2.0下载任何依赖项进行测试,但是如果未构建测试,则可以在没有它的情况下使用。
SI使用柯南的cmakedeps发电机来查找依赖关系。安装依赖项使用
conan install . --output-folder=build --build=missing --settings=build_type=Debug替换--settings=build_type=Debug带有--settings=build_type=Release 。
通过使用CMakedEPS生成器,您可以手动构建或使用提供的CMAKE预设。
cmake --preset=ci-ninja-debug
cmake --build buildSI的默认安装位置是/usr/local/lib/SI 。可以使用RAW CMAKE,CPACK(CMAKE包装机构)或作为CONAN.IO软件包安装SI
有关详细说明,请参见“安装指南”
注意:首选将SI作为柯南包。
要使用Cmake的提取器安装,请在您的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可从此存储库中下载,也可以作为柯南包下载。从柯南中心获得SI是首选的方式。
有关更多信息和更深入的技术详细信息,请参阅实施详细信息文档
高于2.0.0的版本将与较旧版本完全兼容,因为ChangElog中提到的破坏变化。从Conan软件包上的2.0.0版本中,命名为Lower Case si ,以符合Conan命名约定。