2017-01-05 1 views
0

私のプログラムでは、タイプセーフな計算と自動変換のためにboost :: unitsを利用したいと思います。ライブラリーの初心者ユーザーとして、どのように動作するのか、暗黙的なタイプ変換がforbiddenであるのかを基本的に理解しています。boost :: unitsとの混合単位

今私はmy_massはニュートンキロとmy_forceで表現されます。この

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); 

ようなコードを書くことができます。しかし、doubleだけを受け入れる他のライブラリとやり取りするときの便宜のために、私は力がキロニュートンであることを好むでしょう(同様に、MegaPascalでの圧力)。だから私はこれを行う:

typedef make_scaled_unit<force, scale<10, static_rational<3>>>::type kiloforce; 
quantity<kiloforce> scaled_force(my_mass * 9.81 * meter/pow<2>(second)); 

これは動作しますが、明示的な変換を強制します。正当に次のコードはコンパイルされません。

quantity<kiloforce> scaled_force = my_mass * 9.81 * meter/pow<2>(second); 

これは暗黙の変換を表すためです。私の質問は次のとおりです。量を選択した単位で表現できるようにライブラリを構成する方法はありますか?

結局のところ、これは「キログラム」の場合ですから、scaled unitsを調べましたが、動作させる方法が見つからないようです。考え方はカスタムシステムを定義することでしたが、質量、力、圧力は互いに関係しているので、これは可能ではありません。here

答えて

0

基本的な問題は、キロニュートンで無次元の力を探しているようです。それはnot hardです:

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

物理学の問題は、 "kiloforce" のようです。それは物理学の仕組みではありません。力は接頭辞を持たない。例えば。長さ対メートル/キロメートルおよび質量対グラム/キログラム。同様に、力対ニュートン/キロニュートン。言っ

は、私はあなたが秒平方あたりのキロメートルで地球の加速を表現したい、なぜ私に聞かないでください

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

を示唆するかもしれないが、キロニュートン は、PERが二乗キロキログラムです。

+0

あなたが提案したもの(かわいらしいですが)や「量(my_force).value()」のような変換は、私が避けようとしているものです。 'km * kg/s2'で表現された' g 'はちょっとハッキリしていると感じます。それはおそらく、力を含まない他の計算に干渉するでしょう。 – matpen

+0

「それは私が尋ねたやり方ではできない」と説明しているので、答えを受け入れる。 – matpen

関連する問題