// 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 #include #include #include //[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 {}; typedef currency_base_dimension::dimension_type currency_type; template struct currency_base_unit : base_unit, 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, currency_base_unit, double, get_conversion_factor(N1, N2)); //] int main() { boost::units::quantity dollars = 2.00 * us_dollar(); boost::units::quantity euros(dollars); set_conversion_factor(0, 1, 2.0); dollars = static_cast >(euros); set_conversion_factor(0, 1, .5); euros = static_cast >(dollars); double value = euros.value(); // = .5 if(value != .5) { return(1); } else { return(0); } }