
mp-units - ห้องสมุดปริมาณและหน่วยสำหรับ C ++ไลบรารี MP-units อาจเป็นเรื่องของมาตรฐาน ISO สำหรับ C ++ 29 เพิ่มเติมเกี่ยวกับเรื่องนี้สามารถพบได้ในข้อเสนอ ISO C ++ ต่อไปนี้:
เรากำลังมองหาฝ่ายที่สนใจในการดูแลห้องสมุด
การแนะนำสั้น ๆ เกี่ยวกับอินเทอร์เฟซของห้องสมุดและเหตุผลสำหรับการเปลี่ยนแปลงในเวอร์ชัน 2.0 ของ หน่วย MP ได้รับการให้รายละเอียดโดย Mateusz Pusz ใน "พลังของเทมเพลต C ++ ที่มีหน่วย MP: บทเรียนที่เรียนรู้ & การออกแบบห้องสมุดใหม่"
เอกสารโครงการที่กว้างขวางสามารถพบได้ในหน้า MP-units GitHub มันมีคำแนะนำในการติดตั้งและคู่มือผู้ใช้โดยละเอียด
โครงการนี้ใช้คำศัพท์ทางมาตรวิทยาอย่างเป็นทางการที่กำหนดโดย ISO และ BIPM โปรดทำความคุ้นเคยกับข้อกำหนดเหล่านั้นเพื่อทำความเข้าใจเอกสารและปรับปรุงการสื่อสารที่เกี่ยวข้องกับโดเมนและการอภิปราย คุณสามารถค้นหาคำจำกัดความที่เกี่ยวข้องกับโครงการที่จำเป็นในบท "อภิธานศัพท์" ของเอกสารของเรา คำศัพท์เพิ่มเติมมีอยู่ในคำศัพท์อย่างเป็นทางการของ ISO และ BIPM
mp-units เป็นไลบรารี C ++ ที่เปิดใช้งานเวลาคอมไพล์ที่ให้การวิเคราะห์มิติเวลาคอมไพล์และการจัดการหน่วย/ปริมาณ
นี่คือตัวอย่างเล็ก ๆ ของการดำเนินงานที่เป็นไปได้:
# 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);ลองใช้กับ Compiler Explorer
ห้องสมุดนี้ใช้คุณสมบัติ C ++ 20 อย่างหนัก (แนวคิดคลาสเป็น NTTPS, ... ) ต้องขอบคุณพวกเขาที่ผู้ใช้จะได้รับอินเทอร์เฟซที่ทรงพลัง แต่ก็ยังใช้งานง่ายและการแปลงหน่วยและการวิเคราะห์มิติทั้งหมดสามารถทำได้โดยไม่ต้องเสียสละประสิทธิภาพรันไทม์หรือความแม่นยำ โปรดดูตัวอย่างด้านล่างสำหรับตัวอย่างอย่างรวดเร็วของคุณสมบัติไลบรารีพื้นฐาน:
# 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
}ลองใช้กับ Compiler Explorer