
mp-units C ++의 수량 및 단위 라이브러리MP-Units 라이브러리는 C ++ 29에 대한 ISO 표준화의 주제 일 수 있습니다. 이에 대한 자세한 내용은 다음 ISO C ++ 제안서에서 찾을 수 있습니다.
우리는 도서관의 현장 시험에 관심이있는 당사자를 적극적으로 찾고 있습니다.
MP-units가있는 C ++ 템플릿의 힘 : 학습 및 새로운 라이브러리 디자인 "SEA 2023 회의의 C ++에서"MP-Units 버전 2.0 버전의 변경에 대한 간단한 도서관 인터페이스와 MP-Units 버전의 변화에 대한 간단한 소개는 Mateusz Pusz에 의해 상세하게 제공되었습니다.
광범위한 프로젝트 문서는 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);컴파일러 탐색기에서 시도하십시오.
이 라이브러리는 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
}컴파일러 탐색기에서 시도하십시오.