
Boost : 
From: Hugo Duncan (hugoduncan_at_[hidden])
Date: 20031024 17:39:16
Hugo Duncan <hugoduncan_at_[hidden]> wrote:
> quantity<NumericType, Unit, Dimension>
on second thoughts, that was not so well thought out. This
is somewhat better, providing a clean seperation of dimensions
and units.
//! definition of length dimension (integers for exposition)
typedef mpl::vector< 1, 0, 0, 0, 0, 0, 0> length;
//! definition of meters and millimeters as units of length
struct meter { typedef length dimension; };
struct millimeter { typedef length dimension; };
//! definition of quantity
typedef quantity<double, meter> meters; //< value stored in meters
typedef quantity<double, millimeter> millimeters; //< value stored in
millimeters
Trying to encode the conversion factors into the type signature
seems ugly to me. Unit conversion takes place from one unit to another
and this can be expressed directly (untested code below).
Here the converter class is defined in place, but
this interface could be forwarded to a simpler implementation (eg. just
defining the factor) or to you favourite existing units conversion
library.
template <>
struct converter<millimeter, meter>
{
inline double factor() const { return 0.001; }
// unit power conversion
template <typename BasicNumericType>
static BasicNumericType convert(BasicNumericType value)
{
return value*factor();
}
// rational power conversion
template <typename Rational, typename BasicNumericType>
static BasicNumericType convert(BasicNumericType value)
{
static f( std::pow(factor(), Rational::as_double()) );
return value*f;
}
// rational power conversion
template <typename BasicNumericType>
static BasicNumericType convert(BasicNumericType value, double power)
{
return value*std::pow(factor(), power) );
}
};
Each unit would need a rank, so that the result unit of an aritmetic
expression
could be determined
eg, so
millimeters(3)*millimeters(3) == millimeters(9)
millimeters(3)*meters(0.003) == meters(0.009)
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk