2017-01-05 1 views
0

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.

Antwort

0

Das grundlegende Problem scheint zu sein, dass Sie nach einer dimensionslosen Kraft in Kilonewton suchen. Das ist not hard:

quantity<force> my_force = my_mass * 9.81 * meter/pow<2>(second); 
double F = my_force/(kilo*newtons); // my_force in kN 

Die Physik Problem scheint "kiloforce" zu sein. So funktioniert Physik nicht. Kräfte haben keine Präfixe, Einheiten tun es. Z.B. Länge gegen Meter/Kilometer und Masse gegen Gramm/Kilogramm. Ähnlich, Kraft gegen Nnewton/KiloNewton.

Das heißt, kann ich vorschlagen

make_scaled_unit<acceleration, scale<10, static_rational<3>>>::type g(0.00981); 

Fragen Sie mich nicht, warum Sie die Erdbeschleunigung pro Sekunde zum Quadrat in Kilometern ausdrücken würde, aber ein Kilonewton ist einen Kilometer Kilogramm pro Sekunde zum Quadrat.

+0

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

+0

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

Verwandte Themen