The newtype library provides types and functions to facilitate the creation of strong type aliases.
The code block below demonstrates the basic usage and features of newtype. For a more details description of the library, as well as a full API documentation, please read the docs (also available as a PDF file).
#include <newtype/derivable.hpp>
#include <newtype/deriving.hpp>
#include <newtype/new_type.hpp>
#include <iostream>
using Width = nt::new_type<unsigned int, struct width_tag, deriving(nt::Read)>;
using Height = nt::new_type<unsigned int, struct height_tag, deriving(nt::Read)>;
using Area = nt::new_type<unsigned int, struct area_tag, deriving(nt::Show)>;
struct Rectangle
{
constexpr Rectangle(Width w, Height h)
: width{w}
, height{h}
{
}
auto constexpr area() const noexcept -> Area
{
return {width.decay() * height.decay()};
}
private:
Width width;
Height height;
};
int main()
{
auto width = Width{};
auto height = Height{};
std::cin >> width >> height;
auto rect = Rectangle{width, height};
std::cout << rect.area() << '\n';
}
This library uses features of C++20 and thus requires a modern compiler. All development was done on GCC 9.2. This is a header-only library, and thus no compilation is need if you want to use it in your project. If you want to run the sanity-checks/unit-test, you will need at least CMake 3.9.0. If you want to build to documentation, you will need either a local installation of sphinx, or alternatively pipenv. A Pipfile is provided in the directory docs within the source root.