forked from mpusz/mp-units
3.5 KiB
3.5 KiB
hide
| hide | ||
|---|---|---|
|
Welcome to mp-units!
mp-units is a compile-time enabled feature-rich Modern C++ modular/header-only library that provides compile-time dimensional analysis and unit/quantity manipulation. Its key strengths include safety, performance, and developer experience.
The library source code is hosted on GitHub with a permissive MIT license.
??? info "Supported compilers"
This library tries to provide the best user experience possible with the C++ language.
To achieve that, it extensively uses C++20 features and the
[explicit object parameter](https://en.cppreference.com/w/cpp/language/member_functions#Explicit_object_parameter)
from C++23.
Even though the library benefits from C++23 (if available), C++20 is enough to compile and
use all of the library's functionality. C++23 features are hidden behind
a [preprocessor macro](users_guide/framework_basics/systems_of_quantities.md#defining-quantities)
providing a backward-compatible way to use it.
As of today, the library compiles fine on the following compilers (or newer):
- gcc-11
- please note that we observed some ICEs on gcc-11
- no problems with gcc-12.2+
- clang-16
- apple-clang-15
#include <mp-units/ostream.h>
#include <mp-units/systems/si/si.h>
#include <mp-units/systems/usc/usc.h>
#include <iostream>
using namespace mp_units;
inline constexpr struct smoot : named_unit<"smoot", mag<67> * usc::inch> {} smoot;
int main()
{
constexpr quantity dist = 364.4 * smoot;
std::cout << "Harvard Bridge length = " << dist << "(" << dist.in(usc::foot) << ", " << dist.in(si::metre) << ") ± 1 εar\n";
}
Output:
Harvard Bridge length = 364.4 smoot(2034.57 ft, 620.136 m) ± 1 εar
!!! example "Try it on Compiler Explorer"
??? question "What is smoot?"
The smoot (/ˈsmuːt/) is a nonstandard unit of length created as part of an MIT fraternity prank.
It is named after Oliver R. Smoot, a fraternity pledge to Lambda Chi Alpha, who, in October 1958,
lay on the Harvard Bridge (between Boston and Cambridge, Massachusetts) and was used by his
fraternity brothers to measure the length of the bridge.
One smoot equals Oliver Smoot's height at the time of the prank (five feet and seven inches).
The bridge's length was measured to be 364.4 smoots plus or minus one ear, with the "plus or minus"
intended to express the measurement uncertainty.
Oliver Smoot graduated from MIT with the class of 1962, became a lawyer, and later became
chairman of the American National Standards Institute (ANSI) and president of the International
Organization for Standardization (ISO).
More on the smoot unit of length can be found at <https://en.wikipedia.org/wiki/Smoot>.
!!! important "Important: Help needed!"
The **mp-units** library might be the subject of ISO standardization for C++29. More on this can
be found in the following ISO C++ proposals:
- [P1935: A C++ Approach to Physical Units](https://wg21.link/p1935),
- [P2980: A motivation, scope, and plan for a physical quantities and units library](https://wg21.link/p2980),
- [P2981: Improving our safety with a physical quantities and units library](https://wg21.link/p2981),
- [P2982: `std::quantity` as a numeric type](https://wg21.link/p2982).
We are actively looking for parties interested in field-trialing the library.