2

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 で表現したい場合は、とにかく変換​​が必要です。

誰かがより良い解決策を持っていれば幸いです。

4

0 に答える 0