如何定义表示二维坐标的模板之间的转换?
How to define conversions between templates meant to represent 2D coordinates?
我有一个应用程序,出于某种原因(好吧,速度和存储 space,基本上)我需要使用整数 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
中,我无法混合使用 tPoint
和 tFloatPoint
操作,这既丑陋又低效。
理想情况下,我希望以类似于基本类型提升的方式将 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
限制此构造函数,以确保转换是您想要允许的。
我有一个应用程序,出于某种原因(好吧,速度和存储 space,基本上)我需要使用整数 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
中,我无法混合使用 tPoint
和 tFloatPoint
操作,这既丑陋又低效。
理想情况下,我希望以类似于基本类型提升的方式将 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
限制此构造函数,以确保转换是您想要允许的。