
mp-units - مكتبة الكميات والوحدات لـ C ++قد تكون مكتبة MP-UNITS موضوع توحيد ISO لـ C ++ 29. يمكن العثور على المزيد حول ذلك في مقترحات ISO C ++ التالية:
نحن نبحث بنشاط عن الأطراف المهتمة بتجربة الميدان للمكتبة.
تم توفير مقدمة موجزة لواجهات المكتبة والأساس المنطقي للتغييرات في الإصدار 2.0 من وحدات MP بالتفصيل من قبل Mateusz Pusz في "قوة C ++ قوالب مع وحدات MP: الدروس المستفادة وتصميم مكتبة جديد" الحديث في مؤتمر C ++ في Sea 2023.
يمكن العثور على وثائق المشروع الواسعة في صفحات GitHub وحدات MP. ويشمل تعليمات التثبيت ودليل المستخدم التفصيلي.
يستخدم هذا المشروع مفردات القياس الرسمية التي حددها 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);جربه على مستكشف التحويل البرمجي.
تستخدم هذه المكتبة بشكل كبير ميزات 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
}جربه على مستكشف التحويل البرمجي.