Front Page / Tutorial: Metafunctions and Higher-Order Metaprogramming / Dimensional Analysis / Representing Quantities

# Representing Quantities

The types listed above are still pure metadata; to typecheck real computations we'll need to somehow bind them to our runtime data. A simple numeric value wrapper, parameterized on the number type `T` and on its dimensions, fits the bill:

    template <class T, class Dimensions>
    struct quantity
    {
        explicit quantity(T x)
           : m_value(x)
        {}

        T value() const { return m_value; }
     private:
        T m_value;
    };

Now we have a way to represent numbers associated with dimensions. For instance, we can say:

    quantity<float,length> l( 1.0f );
    quantity<float,mass> m( 2.0f );

Note that `Dimensions` doesn't appear anywhere in the definition of `quantity` outside the template parameter list; its only role is to ensure that `l` and `m` have different types. Because they do, we cannot make the mistake of assigning a length to a mass:

    m = l;    // compile-time type error