Thanks to visit codestin.com
Credit goes to github.com

Skip to content

mpusz/mp-units

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

logo

GitHub license GitHub license

Conan CI CMake CI clang-tidy CI Freestanding CI Formatting CI GitHub Workflow Documentation

Conan stable Conan testing

mp-units – The quantities and units library for C++

The mp-units library is a candidate for ISO standardization for C++29. More context can be found in the following ISO C++ proposals:

We are actively seeking organizations and individuals interested in field‑trialing the library.

Documentation

Extensive project documentation is available on the project site. It includes installation instructions, a detailed user's guide, design rationale, an API reference, tutorials, and examples.

If you're new and just want to experiment, jump to the TL;DR below.

TL;DR

mp-units is a Modern C++ (C++20 and later) library providing compile‑time dimensional analysis and safe manipulation of units, quantities, and quantity points.

Key features

  • Strongly typed quantities, units, dimensions, and quantity points (affine space)
  • Compile‑time dimensional analysis and conversion with no runtime overhead
  • Unified model for units, dimensions, quantity specifications, and origins
  • Quantity, unit, and dimension text formatting (portable & UTF‑8 aware)
  • C++ modules support (when available) and header‑only usage
  • Configurable contracts, freestanding mode, and natural units (experimental)
  • Interoperability pathways for legacy and external libraries

Here is a small example of typical operations:

#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);

Try it on the Compiler Explorer.

The library makes extensive use of C++20 features (concepts, class types as NTTPs, etc.). This enables powerful yet easy‑to‑use interfaces while performing all conversions and dimensional analysis at compile time—without sacrificing runtime performance or accuracy.

The example below shows a broader preview of basic capabilities:

#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
}

Try it on the Compiler Explorer.

Try It Out

Compiler Explorer

As seen in the previous chapter, mp-units is available on Compiler Explorer. Use it for a fast, zero‑setup trial or to prototype ideas.

GitHub Codespaces

For more advanced development or contributions, we encourage you to use our pre‑configured GitHub Codespaces environment. You can either click the button below

Open in GitHub Codespaces

or navigate to the repository main page and click “Code” → “Codespaces” → “Create codespace on master”.

You can also use the pre‑configured devcontainer and Docker image manually within your IDE.

For detailed environment documentation, see .devcontainer/README.md.

Install as a Dependency

We recommend using Conan to integrate mp-units with your project. However, there are also other ways to make it work. Please refer to our Installation and Usage documentation chapter for more details.