如何定义用于表示二维坐标的模板之间的转换

How to define conversions between templates meant to represent 2D coordinates?

本文关键字:坐标 转换 之间 二维 何定义 定义 用于 表示      更新时间:2023-10-16

我有一个应用程序,由于某些原因(基本上是速度和存储空间),我需要在大多数时间内使用整数2D坐标。

不过,一些中间计算需要浮点。

我定义了一个模板来实现对整数值和双值坐标的相同操作,比如:

template <typename T>
struct tTypedPoint {
    T x, y;
    tTypedPoint() {}
    tTypedPoint(T x, T y) : x(x), y(y) {}
    tTypedPoint(const tTypedPoint & p) { *this = p; }
    tTypedPoint operator+ (const tTypedPoint & p) const { return{ x + p.x, y + p.y }; }
    tTypedPoint operator- (const tTypedPoint & p) const { return{ x - p.x, y - p.y }; }
    tTypedPoint operator* (T scalar) const { return{ x * scalar, y * scalar }; }
    tTypedPoint operator/ (T scalar) const { return{ x / scalar, y / scalar }; }
    bool operator== (const tTypedPoint & p) const { return x == p.x && y == p.y; }
    T dot(const tTypedPoint &p) const { return x*p.x + y * p.y; } // dot product  
};
typedef short  tCoord;
typedef double tFloatCoord;
typedef tTypedPoint<tCoord     > tPoint;
typedef tTypedPoint<tFloatCoord> tFloatPoint;

事实上,如果不将tPoints明确复制到tFloatPoints中,我就无法混合tPointtFloatPoint操作,这既丑陋又低效。

理想情况下,我希望以类似于基本类型提升的方式将tPoint转换为tFloatPoint(例如,将int提升为double)。

坦率地说,如果可能的话,我不知道该怎么做
我已经研究了转换运算符,但我不知道在这种情况下如何定义它们(你必须在某个地方指定转换点的类型,但我看不到在哪里)。

我确信我遗漏了一些显而易见的东西,但我的大脑根本无法处理这个问题。

您可以添加一个模板构造函数:

template <typename T>
struct tTypedPoint {
    T x, y;
    template<typename U>
    tTypedPoint(const tTypedPoint<U>& rhs) : x(rhs.x), y(rhs.y) {}
    // Previous code
};

您也可以使用SFINAE或static_assert来限制此构造函数,以确保转换是您想要允许的。