- 



ส่วนหัวเฉพาะห้องสมุด C ++ ที่ให้ความปลอดภัยประเภทและตัวอักษรที่ผู้ใช้กำหนดไว้สำหรับการจัดการค่าทางกายภาพที่กำหนดไว้ในระบบระหว่างประเทศของหน่วยที่ควบคุมโดยสำนักน้ำหนักและมาตรการระหว่างประเทศ (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 ให้การแปลงและการดำเนินการทางคณิตศาสตร์ด้วยค่าของระบบระหว่างประเทศใด ๆ ของหน่วยที่มี ความปลอดภัยประเภทที่แข็งแกร่งในเวลาที่รวบรวม หน่วยทั้งหมดเป็น typedefs พิเศษของเทมเพลต struct SI::unit_t เฉพาะค่าของหน่วยเท่านั้นที่เก็บไว้ภายในอัตราส่วน (เช่น milli, micro, kilo ... ) ถูกกำหนดเป็นลักษณะประเภทเพื่อให้ทุกหน่วยมีความละเอียดเดียวกันในอัตราส่วนที่ใช้งานทั้งหมด SI จัดการการดำเนินงานของหน่วยที่มีอัตราส่วนเดียวกันและเมื่ออัตราส่วนแตกต่างกัน ดูรายละเอียดการใช้งานเอกสารสำหรับข้อมูลเพิ่มเติม การดำเนินงานระหว่างหน่วยที่มีอัตราส่วนเดียวกันนั้นไม่มีค่าใช้จ่ายอื่น ๆ มีค่าใช้จ่ายในการคำนวณเพิ่มเติมเพื่อปรับค่าให้กับหน่วย การส่งธง SI_DISABLE_IMPLICIT_RATIO_CONVERSION ไปยังการแปลงอัตราส่วนโดยนัยของคอมไพเลอร์ไม่ได้ทำและล้มเหลวด้วยข้อผิดพลาดของคอมไพเลอร์ ดูผลลัพธ์เกณฑ์มาตรฐานอย่างต่อเนื่องสำหรับการเปรียบเทียบระหว่างการวัดอ้างอิงและการใช้งานใน SI
เป็นไปได้ที่จะจัดหาอัตราส่วนที่กำหนดเองให้กับประเภทในตัวและเข้ากันได้อย่างสมบูรณ์สำหรับการคำนวณกับหน่วยอื่น ๆ อย่างไรก็ตามผู้ใช้ต้องจัดหาตัวอักษรหรือ typedefs ที่จำเป็น ตัวอย่างเช่น SI::velocity_t<double, std::ratio<1000, 36>> จะเป็น "กิโลเมตรต่อหนึ่งร้อยของ-ชั่วโมง"
การแปลงระหว่างหน่วยจะทำด้วยฟังก์ชั่นสมาชิก as<unit_t>() ของ unit_ หรือฟังก์ชั่นฟรี SI::unit_cast<unit_t>(unit_t u) สิ่งนี้จะแปลงค่าประเภทเดียวกัน แต่อัตราส่วนที่แตกต่างกัน
สำหรับแต่ละหน่วยตัวอักษรที่มีอยู่จะเป็นอัตราส่วนที่นำมาใช้นำหน้าด้วยขีดล่าง เช่น _mm _km โดยทั่วไปอัตราส่วนจะเป็นไปตามคำนำหน้าตัวชี้วัดของระบบระหว่างประเทศของหน่วย typedefs จะถูกนำหน้า (หรือในกรณีที่หายาก) กับคำนำหน้าตัวชี้วัดมาตรฐาน เช่น metre_t, milli_metre_t, kilo_metre_t คำนำหน้าหรืออินเทอร์กซ์ถูกทำเครื่องหมายด้วย * ในตารางด้านล่าง หน่วยที่กำหนด typedefs และตัวอักษรสามารถแปลงเป็นสตริงโดยใช้ตัวดำเนินการสตรีมหรือฟังก์ชัน SI::to_string หากต้องการใช้ตัวดำเนินการสตรีมให้รวมไฟล์ส่วนหัว SI/stream.h
| หน่วย | สัญลักษณ์มิติ | สัญลักษณ์หน่วย | อัตราส่วนที่ดำเนินการ | หน่วย typedefs |
|---|---|---|---|---|
| ความยาว | l | ม. | 10 -18 ถึง 10 18 | *_metre_t |
| เวลา | T | S | 10 -18 ถึง 10 0 และ 60/1, 3600/1 | *_seconds_t, minutes_t, hours_t |
| มวล* | ม. | กิโลกรัม | 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 หรือสัญลักษณ์หลายตัว
| หน่วย | สัญลักษณ์มิติ | ตัวแทน | สัญลักษณ์หน่วย | อัตราส่วนที่ดำเนินการ | หน่วย 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 | ราด | 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 ที่ยาวนาน
หน่วยทั้งหมดที่สามารถสร้างได้จากหน่วยอื่น ๆ ที่สลายตัวไปยังหน่วยที่เกี่ยวข้องโดยการย้อนกลับการดำเนินการทางคณิตศาสตร์ เช่น Q = I * T ดังนั้น Q / I = T และ Q / T = I
| หน่วย | สัญลักษณ์มิติ | สัญลักษณ์หน่วย | สร้างได้จาก | ดำเนินการตามตัวอักษร | หน่วย typedefs |
|---|---|---|---|---|---|
| ความเร็ว | V | M/S | 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 |
| การนำไฟฟ้า | ก | S | i / u, 1 / r | เกี่ยวกับ ES | *_siemens_t |
| ความจุไฟฟ้า | C | f | ถาม / คุณ | AF ถึง EF | *_farad_t |
| บังคับ | f | n | M * A | เพื่อ en | *_newton_t |
| ความดัน | P | PA | f / l^2 | APA ถึง EPA | *_pascal_t |
| พลังงาน | อี | J | f * l, p * l^3 | AJ ถึง EJ | *_joule_t |
| พลัง | P | W | E/T | aw to ew | *_watt_t |
| ฟลักซ์แม่เหล็ก | f* | wb | คุณ * t | awb ถึง ewb | *_weber_t |
| สนามแม่เหล็ก | ข | T | f/l^2 | ที่ ET | *_tesla_t |
| แรงผลักดัน | o* | kg⋅m/s | M * V | ไม่มี | ไม่มี |
| การเหนี่ยวนำ | l | ชม | f / i | อาไปเอ๊ะ | *_henry_t |
| ฟลักซ์เรืองแสง | M* | LM | J * r | ALM ถึง Elm | *_lumen_t |
| ความส่องสว่าง | ฉัน* | LX | M / A | ALX ถึง ELX | *_lux_t |
| กัมมันตภาพรังสี | อัน | BQ | ABQ ถึง EBQ | *_becquerel_t | |
| ปริมาณดูดซึม | d | ผู้มีส่วนร่วม | Agy to Egy | *_gray_t | |
| ปริมาณที่เท่ากัน | ชม | 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 หรือสัญลักษณ์หลายตัว สัญลักษณ์มิติสำหรับความต้านทานไฟฟ้าควรเป็น Ω (Ohm) และสำหรับฟลักซ์แม่เหล็ก Φ (Phi) ความส่องสว่างควรเป็น e b ความเร็วเชิงมุมควรเป็นΩ (โอเมก้า) ฟลักซ์เรืองแสงควรเป็นφ V ซึ่งได้รับการสนับสนุนน้อยกว่า Φ (Phi) เอง
หน่วยที่ไม่ใช่มาตรฐานไม่ได้รับการควบคุมโดย BIPM แต่ได้รับการยอมรับสำหรับการใช้งานกับมาตรฐาน SI
| หน่วย | สัญลักษณ์มิติ | ตัวอักษร | อัตราส่วนที่ดำเนินการ | หน่วย typedefs |
|---|---|---|---|---|
| หน่วยความยาวดาราศาสตร์ | l | au, ly, pc | 149597870691: 1 (AU), 9460730777119564: 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 ใช้เครื่องกำเนิด CMakeps ของ Conan เพื่อค้นหาการพึ่งพา เพื่อติดตั้งการใช้งานการพึ่งพา
conan install . --output-folder=build --build=missing --settings=build_type=Debug แทน --settings=build_type=Debug ด้วย --settings=build_type=Release เพื่อสลับระหว่างการดีบักและการสร้าง
ด้วยการใช้เครื่องกำเนิด CMakakesps คุณสามารถสร้างด้วยตนเองหรือใช้ CMake ที่ตั้งไว้ล่วงหน้า
cmake --preset=ci-ninja-debug
cmake --build build ตำแหน่งการติดตั้งเริ่มต้นสำหรับ SI คือ /usr/local/lib/SI SI สามารถติดตั้งได้โดยใช้ CMAKE RAW, CPACK (กลไกแพ็คเกจ CMakes) หรือเป็นแพ็คเกจ conan.io ที่จัดทำจาก Conan Center
ดูคู่มือการติดตั้งสำหรับคำแนะนำโดยละเอียด
หมายเหตุ: การรับ 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 การได้รับ SI จาก Conan-Center เป็นวิธีที่ต้องการ
สำหรับข้อมูลเพิ่มเติมและรายละเอียดทางเทคนิคที่ลึกซึ้งยิ่งขึ้นอ้างอิงเอกสารรายละเอียดการใช้งาน
เวอร์ชันที่สูงกว่า 2.0.0 จะไม่เข้ากันได้อย่างสมบูรณ์กับรุ่นเก่าเนื่องจากการเปลี่ยนแปลงที่เกิดขึ้นในการเปลี่ยนแปลง จากเวอร์ชัน 2.0.0 บนแพ็คเกจโคนันมีชื่อว่า Lower Case si เพื่อให้สอดคล้องกับอนุสัญญาการตั้งชื่อโคนัน