boost::units
プロジェクトで を使用して、次元分析と単位系間の自動変換を使用したいと考えています。コード内の量を標準の工学単位で表現したいと思います。これは多くの場合、他の単位のスケーリングされたバージョンです。これを例を挙げて説明しましょう。次のシステムを定義するとします。
typedef make_system<
us::foot_base_unit,
us::pound_base_unit,
si::second_base_unit>::type my_system;
BOOST_UNITS_STATIC_CONSTANT(feet,length);
BOOST_UNITS_STATIC_CONSTANT(pound,mass);
次に、長さの単位がフィート、力、lb*ft*s^-2
圧力で定義されlb*ft^-1*s^-2
ます。ただし、ポンドフォース単位で力を使用し、平方インチあたりのポンドフォースである PSI で圧力を使用したいと思います。スケーリングされた単位を使用してこれらを表現し、交換可能に使用できると思っていましたが、そうではないようです。
私はこれを試しました:
struct poundforcescale {
typedef double value_type;
double value() const { return 32.174049; }
};
typedef make_scaled_unit<force, poundforcescale>::type poundForce;
namespace boost {
namespace units {
std::string name_string(const field::poundForce&) { return "pound-force"; }
std::string symbol_string(const field::poundForce&) { return "lbf"; }
}
}
問題なくコンパイルされました。しかし、次のようにスケーリングされたユニットを使用しようとしたとき:
poundForce poundForceInst;
quantity<field::poundForce> f2 = 1*poundForceInst;
quantity<field::force> f3 = f2;
コンパイルは「実行可能な変換エラー」で失敗しました。スケーリングされた単位のポイントは、これらの変換を自動的に行うことだと思いました。また、ドキュメンテーションでは、ポンド力の量を出力するには name_string と symbol_string を定義するだけでよいと思いましたが、これは
std::cout << "f2 = " << f2 << std::endl;
「boost::units::scale_list_dim にシンボルという名前のメンバーがありません」というエラーが発生しました。これらの関数のオーバーロードは、スケーリングされたユニットでは機能しないようです。
多分私はこのような別のシステムを定義する必要があります
typedef make_system<
us::foot_base_unit,
us::pound_force_base_unit,
si::second_base_unit>::type my_system;
しかし、長さを ft で、圧力を psi で表現したい場合は、とにかく変換が必要です。
誰かがより良い解決策を持っていれば幸いです。