#include #include #include #include #include #include #include #include #include #include #include namespace myproject { namespace second_types { struct radii_base_unit : public boost::units::base_unit { static std::string name() { return("radii"); } static std::string symbol() { return("r"); } }; /// --- dimensions --- typedef boost::units::make_dimension_list < boost::mpl::list < boost::units::dim < boost::units::length_base_dimension, boost::units::static_rational<-1> > > >::type length_dimension; typedef boost::units::make_dimension_list < boost::mpl::list < boost::units::dim < boost::units::length_base_dimension, boost::units::static_rational<2> > > >::type squared_length_dimension; /// --- systems --- /// placeholder class defining unit system typedef boost::units::make_system::type system; // --- quantities --- typedef boost::units::unit radii_unit; typedef boost::units::unit inv_radii_unit; typedef boost::units::unit squared_radii_unit; typedef boost::units::quantity squared_radii_t; typedef boost::units::quantity radii_t; typedef boost::units::quantity inv_radii_t; // --- static constants --- BOOST_UNITS_STATIC_CONSTANT(radii,radii_unit); struct equatorial_radius_of_earth_t { typedef boost::units::quantity value_type; operator value_type() const { return 1 * radii; } value_type value() const { return 1 * radii; } value_type uncertainty() const { return 0; } value_type lower_bound() const { return 1 * radii; } value_type upper_bound() const { return 1 * radii; } }; BOOST_UNITS_STATIC_CONSTANT(AE, boost::units::constant > ); } namespace types { typedef boost::units::quantity meters; typedef boost::units::make_dimension_list < boost::mpl::list < boost::units::dim < boost::units::length_base_dimension, boost::units::static_rational<-1> > > >::type length_dimension; typedef boost::units::unit inv_meter_unit; typedef boost::units::quantity my_meter; } } int main ( int, char** ) { using namespace myproject::types; using namespace myproject::second_types; meters val1 ( 5 * boost::units::si::meter ); meters val2 ( 3 * boost::units::si::meter ); my_meter result = 1.0 / ( val1 - val2 ); std::cout << result << std::endl; radii_t val3 ( 5 * radii ); radii_t val4 ( 7 * radii ); inv_radii_t result2 = 1.0 / ( val3 - val4 ); std::cout << result2 << std::endl; std::cout << AE << std::endl; squared_radii_t ae_squared = boost::units::pow<2> ( AE ); std::cout << ae_squared << std::endl; return 0; }