Coordinates<System>
私は5つの座標系(A、B、C、D、Eと呼びましょう)を実装しており、それぞれが座標を保持する独自のタイプを持っています。異なるシステムの座標間でC++コンパイラが自動的に正しく変換されるようにしたい。座標変換はグラフを形成します:ABCDとCE。したがって、8つの基本変換のみを指定する必要があり、コンパイラーが残りを生成します。
enum CoordSys { A,B,C,D,E };
template<CoordSys System> struct Coordinates;
template<> struct Coordinates<A> { // specialisation for system A
// ...
operator Coordinates<B>() const; // implements transformation A -> B
};
template<> struct Coordinates<B> { // specialisation for system B
// ...
operator Coordinates<A>() const; // implements transformation B -> A
operator Coordinates<C>() const; // implements transformation B -> C
};
template<> struct Coordinates<C> { // specialisation for system C
// ...
operator Coordinates<B>() const; // implements transformation C -> B
operator Coordinates<D>() const; // implements transformation C -> D
operator Coordinates<E>() const; // implements transformation C -> E
};
template<> struct Coordinates<D> { // specialisation for system D
// ...
operator Coordinates<C>() const; // implements transformation D -> C
};
template<> struct Coordinates<E> { // specialisation for system E
// ...
operator Coordinates<C>() const; // implements transformation E -> C
};
コンパイラは、たとえば、任意の2つのシステムの座標間の変換を実行します。
double radiusE(Coordinates<E> const&x); // radius is best computed from system E
template<CoordSys Sys> double radius(Coordinates<Sys> const&x)
{ return radiusE(x); } // implicit type conversion to system E
ただし、// ...
パーツが長く、ほとんど同じである可能性があるため、特殊化は面倒です(共通ベースから継承する場合は、それでも面倒です)。理想的には、特殊化を避け、クラステンプレートの定義を1つだけにしたいのですが、Coordinates<>
どうすればよいでしょうか。または、別の便利なオプションはありますか?