- 



国際Weights bureau of Weights and Measure(BIPM)によって規制され、SIパンフレットで公開された国際ユニットシステムで定義された物理的価値を処理するためのタイプの安全性およびユーザー定義リテラルを提供するヘッダーのみのC ++ライブラリ。クイックスタートについては、インストールガイドを参照してください。貢献とコメントを歓迎します。詳細については、拠出ガイドラインを確認してください。
実例:
# 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の特別なtypedefsです。ユニットの値のみが内部に保存され、比率(つまりmilli、micro、kilo ...)は、すべてのユニットが実装された比率全体で同じ解像度を持つことを可能にするタイプ特性として決定されます。 SIは、同じ比率の単位の操作と、比率が異なる場合に処理します。詳細については、ドキュメントの実装の詳細を参照してください。同じ比率のユニット間の操作はオーバーヘッドフリーであり、それ以外の場合は、値をユニットに調整するための追加の計算コストがあります。フラグをSI_DISABLE_IMPLICIT_RATIO_CONVERSIONに渡すコンパイラの暗黙比変換は行われず、コンパイラエラーで失敗します。参照測定とSIの実装との比較については、連続ベンチマークの結果を参照してください。
組み込みのタイプにカスタム比率を提供することが可能であり、他のユニットとの計算に完全に互換性があります。ただし、必要なリテラルまたはtypedefsをユーザーが提供する必要があります。たとえばSI::velocity_t<double, std::ratio<1000, 36>>は「1時間の1時間あたり1キロメートル」になります。
ユニット間の変換は、 as<unit_t>() unit_のメンバー関数またはフリー関数SI::unit_cast<unit_t>(unit_t u)で行われます。これにより、同じタイプの値が異なる比率が変換されます。
各ユニットの使用可能なリテラルは、アンダースコアが付いた実装された比率です。すなわち_mm 。 _km 。一般に、比率は、Typedefsが標準のメトリックプレフィックスとプレフィックス(またはまれな場合は補間)されているユニットの国際システムのメトリックプレフィックスに従います。 IE metre_t, milli_metre_t, kilo_metre_t 。プレフィックスまたはインターフィックスには、下のテーブルに*がマークされています。 typedefとリテラルを定義したユニットは、ストリーム演算子または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 | kg | 10 -15〜10 18 | *_gram_t 、 *_ton_t |
| 電流 | 私 | a | 10 -18〜10 18 | *_ampere_t |
| 熱力学温度** | t | k | 10 -18〜10 18 | *_kelvin_t |
| 物質の量 | n | モル | 10 -18〜10 18 | *_mol_t |
| 光度 | j | CD | 10 -18〜10 18 | *_candela_t |
*質量の場合、基本比はSIユニットテーブルで定義されているようにkg ( gではありません)です。したがって、リテラルプレフィックスと内部表現の間には不一致があります。
**熱力学温度の寸法記号はΘ (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 | Hz | 10 -18〜10 18 | *_hertz_t |
| 角度* | r | 1 | rad | 10 -18〜1 | *_radian_t |
| 角度(度)* | r | 1 | deg | マイクロ、ミリ、1 | *_radian_t |
| 静脈角* | r | 1 | sr | 10 -18〜1 | *_steradian_t |
*角度、角度(程度)、および元角度は単純な容器であり、2* PI後のオーバーフローなどの角度/固体計算を行う機能を含むものではありません。ラジアンと程度の間の変換は、特に長いINTとして表現する必要があるため、比率が十分に正確ではないため、 long doublesで作業する場合、精度を失う可能性があります
他のユニットから構築できるすべてのユニットは、数学操作を反転させることにより、それぞれのユニットに減衰します。 IEの場合はQ = I * T then Q / I = TおよびQ / T = I
| ユニット | ディメンションシンボル | ユニットシンボル | から構築可能 | 実装されたリテラル | ユニットtypedefs |
|---|---|---|---|---|---|
| 速度 | v | MS | L / t | m_p_s 、 km_p_h 、 _c | metre_per_second_t 、 kilometre_per_second_t 、 speed_of_light_t |
| 加速度 | a | m/s^2 | v / t、v^2 / l | なし | なし |
| 電荷 | Q | c | それ | acからec | *_coulomb_t |
| 電位 | u | v | P / I、E / Q | AVからEV | *_volt_t |
| 電気抵抗 | o* | オーム(ω) | u / i、1 / g | aohm to eohm | *_ohm_t |
| 電気コンダクタンス | g | s | I / u、1 / r | esに関して | *_siemens_t |
| 電力容量 | c | f | Q / u | afからef | *_farad_t |
| 力 | f | n | m * a | en | *_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 | aw to ew | *_watt_t |
| 磁束 | f* | WB | u * t | AWBからEWBへ | *_weber_t |
| 磁場 | b | t | f/l^2 | at to et | *_tesla_t |
| 勢い | o* | kg⋅m/s | m * v | なし | なし |
| インダクタンス | l | h | f / i | ああ、ええ | *_henry_t |
| 光束 | m* | lm | J * r | アルムからエルム | *_lumen_t |
| 輝度 | 私* | lx | m / a | AlxからElx | *_lux_t |
| 放射能 | a | BQ | ABQからEBQ | *_becquerel_t | |
| 吸収された用量 | d | gy | agyからegy | *_gray_t | |
| 同等の用量 | h | SV | ASVからESV | *_sievert_t | |
| 触媒活性 | k | キャット | n / t | アカットからエカット | *_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)でなければなりません。輝度はE bでなければなりません。角速度はω(オメガ)でなければなりません。光束はΦ (Phi)自体よりもさらにサポートされていないφVでなければなりません。
非標準ユニットは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、Clang7、MSVC 19、およびAppleclang 10.0について検証されています。 Conan 2.0を使用して、テストの依存関係をダウンロードすることをお勧めしますが、テストが構築されていない場合は、それなしで使用できます。
SIは、CONANのCMakedEPSジェネレーターを使用して依存関係を見つけます。依存関係をインストールするには
conan install . --output-folder=build --build=missing --settings=build_type=Debug代替--settings=build_type=Debug with --settings=build_type=Release 。
CmakedEpsジェネレーターを使用することにより、手動で構築するか、提供されているCmakeプリセットを使用できます。
cmake --preset=ci-ninja-debug
cmake --build buildSiのデフォルトのインストール場所は/usr/local/lib/SIです。 SIは、生のcmake、cpack(cmakeパッケージメカニズム)、またはコナンセンターから提供されるconan.ioパッケージとしてインストールできます。
詳細については、インストールガイドを参照してください
注: SIをコナンパッケージとして取得することが推奨されます。
cmakeのfetchcontentでインストールするには、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は、このリポジトリから「RAW」ダウンロードとしてだけでなく、Conanパッケージとしても利用できます。 Conan-CenterからSiを取得することが好ましい方法です。
詳細情報とより深い技術については、実装の詳細ドキュメントを参照してください
2.0.0を超えるバージョンは、Changelogで言及されている壊れた変更のため、古いバージョンと完全に互換性がありません。コナンパッケージのバージョン2.0.0から、コナンネーミング条約に準拠するために、小文字siと名付けられています。