In meinem Programm möchte ich boost :: units für typsichere Berechnungen und automatische Konvertierungen nutzen. Als ein Anfänger Benutzer der Bibliothek habe ich ein grundlegendes Verständnis davon, wie es funktioniert, und warum implizite Typkonvertierung forbidden ist.Gemischte Einheiten mit boost :: units
Im Moment kann ich Code wie diese
using namespace boost::units;
using namespace boost::units::si;
quantity<mass> my_mass(50 * kilogram);
quantity<force> my_force = my_mass * 9.81 * meter/pow<2>(second);
schreibt Wo my_mass
wird in Kilogramm und my_force
in Newton ausgedrückt werden. Aber aus praktischen Gründen, wenn ich mit anderen Bibliotheken interagiere, die nur double
akzeptieren, würde ich bevorzugen, dass die Kräfte in Kilonewton (und ähnlich die Drücke in MegaPascal) sind. Also ich mache das:
typedef make_scaled_unit<force, scale<10, static_rational<3>>>::type kiloforce;
quantity<kiloforce> scaled_force(my_mass * 9.81 * meter/pow<2>(second));
Welche funktioniert, aber erzwingt eine explizite Konvertierung. Der folgende Code zu Recht kompiliert nicht:
quantity<kiloforce> scaled_force = my_mass * 9.81 * meter/pow<2>(second);
Da es eine implizite Konvertierung darstellt. Meine Frage ist dann: Gibt es eine Möglichkeit, die Bibliothek so zu konfigurieren, dass Mengen in der skalierten Einheit der Wahl ausgedrückt werden?
Immerhin ist dies der Fall für "Kilogramm", so dass ich in scaled units schaute, aber ich kann nicht scheinen, einen Weg zu finden, damit es funktioniert. Die Idee wäre gewesen, ein kundenspezifisches System zu definieren, aber da Masse, Kraft und Druck miteinander in Beziehung stehen, ist dies nicht möglich, wie in here erläutert.
Conversions wie die, die Sie vorschlagen (ziemlich glatt, obwohl) oder 'Menge (my_force) .value()' sind, was ich versuche zu vermeiden. Wenn "g" in "km * kg/s2" ausgedrückt wird, fühlt es sich ein bisschen hacky an ... es wird wahrscheinlich andere Berechnungen stören, die keine Kräfte beinhalten. –
matpen
Akzeptieren der Antwort, wie es erklärt, dass "es nicht so gemacht werden kann, wie ich gefragt habe", was nach einiger Zeit richtig ist. – matpen