私のプログラムでは、タイプセーフな計算と自動変換のために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
あなたが提案したもの(かわいらしいですが)や「量(my_force).value()」のような変換は、私が避けようとしているものです。 'km * kg/s2'で表現された' g 'はちょっとハッキリしていると感じます。それはおそらく、力を含まない他の計算に干渉するでしょう。 –
matpen
「それは私が尋ねたやり方ではできない」と説明しているので、答えを受け入れる。 – matpen