我正在实现 5 个坐标系(我们称它们为 A、B、C、D、E),每个坐标系都有自己独特的类型Coordinates<System>
来保存坐标。我希望 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
};
编译器会计算出任意两个系统坐标之间的转换,例如
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
然而,专业化是乏味的,因为这些// ...
部分可能很长而且大致相同(如果我从一个共同的基础继承仍然很乏味)。理想情况下,我想避免专业化并且只定义一个类模板Coordinates<>
——我该怎么做?或者还有其他有用的选择吗?