// Boost.Units - A C++ library for zero-overhead dimensional analysis and // unit/quantity manipulation and conversion // // Copyright (C) 2003-2008 Matthias Christian Schabel // Copyright (C) 2008 Steven Watanabe // // Distributed under the Boost Software License, Version 1.0. (See // accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) #include <boost/units/base_dimension.hpp> #include <boost/units/base_unit.hpp> #include <boost/units/unit.hpp> #include <boost/units/quantity.hpp> //[runtime_conversion_factor_snippet_1 using boost::units::base_dimension; using boost::units::base_unit; static const long currency_base = 1; struct currency_base_dimension : base_dimension<currency_base_dimension, 1> {}; typedef currency_base_dimension::dimension_type currency_type; template<long N> struct currency_base_unit : base_unit<currency_base_unit<N>, currency_type, currency_base + N> {}; typedef currency_base_unit<0> us_dollar_base_unit; typedef currency_base_unit<1> euro_base_unit; typedef us_dollar_base_unit::unit_type us_dollar; typedef euro_base_unit::unit_type euro; // an array of all possible conversions double conversion_factors[2][2] = { {1.0, 1.0}, {1.0, 1.0} }; double get_conversion_factor(long from, long to) { return(conversion_factors[from][to]); } void set_conversion_factor(long from, long to, double value) { conversion_factors[from][to] = value; conversion_factors[to][from] = 1.0 / value; } BOOST_UNITS_DEFINE_CONVERSION_FACTOR_TEMPLATE((long N1)(long N2), currency_base_unit<N1>, currency_base_unit<N2>, double, get_conversion_factor(N1, N2)); //] int main() { boost::units::quantity<us_dollar> dollars = 2.00 * us_dollar(); boost::units::quantity<euro> euros(dollars); set_conversion_factor(0, 1, 2.0); dollars = static_cast<boost::units::quantity<us_dollar> >(euros); set_conversion_factor(0, 1, .5); euros = static_cast<boost::units::quantity<euro> >(dollars); double value = euros.value(); // = .5 if(value != .5) { return(1); } else { return(0); } }