Your First Quantities¶
Welcome to mp-units! In this lesson, you'll create your first quantities and see them in action.
Goal: Create quantities with units and display them
Time: ~10 minutes
What is a Quantity?¶
A quantity combines a numerical value with its unit. For example:
- 120 kilometers (distance)
- 2 hours (time)
- 75 kilograms (mass)
mp-units ensures the value and unit always stay together, preventing unit errors.
Try It: Create Your First Quantity¶
The code below creates quantities. It compiles and runs automatically as you modify it!
// ce-embed height=500 compiler=clang2110 flags="-std=c++23 -stdlib=libc++ -O3" mp-units=trunk
#include <mp-units/systems/si.h>
#include <iostream>
int main()
{
using namespace mp_units;
using namespace mp_units::si::unit_symbols;
// Create a distance
quantity distance = 120 * km;
std::cout << "Distance: " << distance << "\n";
// Create a time duration
quantity time = 2 * h;
std::cout << "Time: " << time << "\n";
// Create a mass
quantity mass = 75 * kg;
std::cout << "Mass: " << mass << "\n";
}
What happened:
quantity distance = 120 * km;creates a quantity with value 120 and unit kilometers- The library remembers both the number AND its unit
- Output shows the complete quantity:
Distance: 120 km
Understanding the Code¶
Let's break it down:
This includes the International System of Units (SI).
This lets us write km, h, kg directly (kilometer, hour, kilogram symbols).
quantityis a class template (the compiler deduces the specific type automatically)120is the numerical valuekmis the unit symbol- The
*operator combines them
Key insight: The quantity type combines a numerical value with its unit, creating
type-safe measurements that prevent unit errors at compile time.
Unit Names vs Symbols¶
So far we've used unit symbols like km, h, kg. But you can also use full unit
names with prefixes:
// ce-embed height=550 compiler=clang2110 flags="-std=c++23 -stdlib=libc++ -O3" mp-units=trunk
#include <mp-units/systems/si.h>
#include <iostream>
int main()
{
using namespace mp_units;
using namespace mp_units::si::unit_symbols;
// Using symbols (imported from unit_symbols namespace)
quantity distance1 = 5.0 * km;
// Using full unit names with prefixes
quantity<si::kilo<si::metre>, double> distance2 = 5.0 * si::kilo<si::metre>;
std::cout << "With symbols: " << distance1 << "\n";
std::cout << "With names: " << distance2 << "\n";
std::cout << "Equal? " << (distance1 == distance2 ? "Yes" : "No") << "\n";
}
When to use each:
- Symbols (
km,m,h): Implementation code - quick and readable - Names (
si::kilo<si::metre>): Header files for function declarations, where you don't want to importunit_symbols
For most code, use symbols
Symbols are more concise and readable but come at the cost of polluting the current
namespace with many short identifiers brought in by the using namespace directives.
Use full names primarily in header files when declaring function interfaces. As a
general C++ best practice, using namespace directives should not appear in the
namespace scope of header files to avoid forcing namespace pollution on users of your
headers.
Key insight: Both symbols and full names create identical quantity types - they're just different syntaxes.
Challenges¶
Try modifying the code above:
- Change values: Try
distance = 250 * km - Try different units: Replace
kmwithm(meters) - Add more quantities: Create
quantity power = 1500 * W;(watts) - Try derived units: Create
quantity speed = 100.5 * m / s;(meters per second)
What You Learned?¶
✅ How to include mp-units headers
✅ Quantities combine values with units
✅ Use value * unit syntax to create quantities
✅ Unit symbols (km) for implementation, full names (si::kilo<si::metre>) for headers
✅ Output quantities with IO streams (std::cout)