/* Copyright (c) 2003-2020 Andy Little. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses./ */ #include #include /* get conversion factor from one dimensionally equivalent quantity type to another */ namespace { template requires units::equivalent_dim inline constexpr std::common_type_t conversion_factor(Target, Source) { // get quantities looking like inputs but with Q::rep that doesn't have narrowing conversion typedef std::common_type_t rep; typedef units::quantity source; typedef units::quantity target; return target{source{1}}.count(); } // get at the units text of the quantity, without its numeric value inline auto constexpr units_str(const units::Quantity AUTO& q) { typedef std::remove_cvref_t qtype; return units::detail::unit_text(); } } // namespace namespace { namespace length { template using m = units::si::length; template using mm = units::si::length; } // namespace length } // namespace using namespace units::si::literals; int main() { std::cout << "conversion factor in mpusz/units...\n\n"; constexpr length::m<> lengthA = 2.0q_m; constexpr length::mm<> lengthB = lengthA; std::cout << "lengthA( " << lengthA << " ) and lengthB( " << lengthB << " )\n" << "represent the same length in different units.\n\n"; std::cout << "therefore ratio lengthA / lengthB == " << lengthA / lengthB << "\n\n"; std::cout << "conversion factor from lengthA::unit of " << units_str(lengthA) << " to lengthB::unit of " << units_str(lengthB) << " :\n\n" << "lengthB.count( " << lengthB.count() << " ) == lengthA.count( " << lengthA.count() << " ) * conversion_factor( " << conversion_factor(lengthB, lengthA) << " )\n"; }