'CoordinateSystem'パラメータで厳密に型指定された3D 'Coordinate'クラスを定義しようとしています。強力な型の座標系を提供するためのテンプレートメタプログラミングの使用
class CoordinateBase {
protected:
double a, b, c;
/* millions of constructors */
}
class System1 : protected CoordinateBase {
public:
double& X() {return a;}
double& Y() {return b;}
double& Z() {return c;}
protected:
/* millions of constructors */
}
class System2 : protected CoordinateBase {
public:
double& Lat() {return a;}
double& Lon() {return b;}
double& Alt() {return c;}
protected:
/* millions of constructors */
}
template<typename T>
class Coordinate : public T {
public:
/* millions of constructors */
}
これは動作しますが、私は、ツリー内の各レベルで関与定型の量に満足していないよ(引数なし/明示的な値/コピー/移動:私が使用している現在のメカニズムの簡易版コンストラクタ、代入演算子)。異なるシステムの座標軸に異なる名前を付けることができるようにしたいと思います。
CRTPのようなものを使用すると便利です。実際の座標値をCoordinateクラスに格納し、静的多態性を使用してSystem1とSystem2から取得するメンバーを持つことができます。残念ながら、私はこれを行うことはできません:
少なくとも、私はいくつかの構文が不足している可能性があります、少なくとも、コンパイラはできません。
私は座標内のすべての有効/無効のロジックを入れていたと考えるもう一つの可能性:
template<typename T>
class Coordinate {
public:
std::enable_if<std::is_same<T, System1>::value, double&> X() {return a;}
private:
double a;
}
しかし、それはかなり速いという醜い取得するために行くと、このクラスの罪のないユーザーに表示されるすべての不快なテンプレートの機械を入れていますがそれ。
私はこの種のものに最適なアプローチが何であるか分かりません。私が望むインターフェースを維持しながら、定型的なコンストラクタ/代入演算子を非常に多く定義する必要を避けるにはどうすればよいですか?
オフトピック:あなたはBoost.Geometryを見たことがありますか?彼らはそこで幾分似たような目標を達成しようとします。 – lisyarus
ちょうど見ていた。私たちの問題空間は、点を使って幾何学的計算をするよりも、座標空間(Boost.Geometryにないいくつかのものを含む)異なる焦点は私が思うように非常に異なる設計目標につながっています –