私は、関数のパラメータを強く入力できるように、ユニットを表現するためのユーザー定義型を作成しようとしています。例えば、長さはミリメートル、速度はミリメートル/秒、加速のためには毎秒ミリメートルなどがあります。私はこれまでのところ、これを行っているユーザー定義型 - 単位、変換
:
mm dist = 5.5_mm;
mm dist1 = dist + 10_mm;
mmpersec velocity = mmpersec(50.0);
mmpersec2 accel = 100.0_mms2;
void set_accel(mmpersec2 accel) { _accel = accel; }
:私は次のように使用できるユニットを作成する
using meters = Value<double, mksUnit<1, 0, 0>>;
using mm = Value<double, mksUnit<-3, 0, 0>>;
constexpr mm operator""_mm(long double v) { return mm(static_cast<double>(v)); }
using mmpersec = Value<double, mksUnit<-3, 0, 1>>;
constexpr mmpersec operator""_mms(long double v) { return mmpersec(static_cast<double>(v)); }
using mmpersec2 = Value<double, mksUnit<-3, 0, 2>>;
constexpr mmpersec2 operator""_mms2(long double v) { return mmpersec2(static_cast<double>(v)); }
:これにより
template<typename T, typename mksUnit>
struct Value
{
// data member
T val;
// constructor
constexpr explicit Value(T d) : val(d) {}
// operator overloads
Value & operator +=(const Value &rhs) { val += rhs.val; return *this; }
// other math and compare
// operators, etc.
}
template<int meters, int kilo, int seconds>
struct mksUnit
{
enum { m = meters, k = kilo, s = seconds };
};
を、私のようなことを行うことができます
私は彼はいくつかのタイプの間で変換を行う必要があり、私はそれを行う良い方法を探しています。私が持っている唯一のアイデアは、クラスから継承し、型オーバーロードを派生クラスに追加することです。
struct millimeters: public mm
{
operator(meters) { return mm.val/1000; }
}
などです。例えば、1.025にLEN設定する必要があり
meters len = meters(5.0);
len += millimeters(25);
:
は、私のような事をやりたいです。
私の質問は、上記のように派生したさまざまなユーザー定義型間でコンバージョンを追加する最もよい方法です。
これは本当に気まぐれに奇妙です。なぜここでテンポを使うのですか?あなたは '' mm''の定義がコンパイル時に変動する可能性のある宇宙に住んでいますか?これらのことはあなたが得ることになる定数に近いものです。 – tadman
私はあなたがこれに間違ったやり方で取り組んでいると感じています。おそらく、時間、距離、重量または質量、温度などの基本単位の単一のタイプが必要です。コンパイル時に質量と時間を必要とする関数を調べることができます。あなたがしなければならない変換は、すべての値を何らかの内部標準(mm、秒、°Kなど)に正規化することで内部的に行うことができます。 – tadman
このアプローチは 'unit :: energy momentum(const unit :: mass&m、const unit :: veolocity&v)'のようなコードにつながります。ここで 'unit :: velocity(const unit :: distance&d、const unit: :time&t) 'を生成します。あなたは* mph *や* inch-pounds *のような便利なコンストラクタや、あなたの問題に実際に適用しているユニットを用意することができます。 – tadman