如何定义用于表示二维坐标的模板之间的转换
How to define conversions between templates meant to represent 2D coordinates?
我有一个应用程序,由于某些原因(基本上是速度和存储空间),我需要在大多数时间内使用整数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
来限制此构造函数,以确保转换是您想要允许的。
相关文章:
- 在C++中使用GDAL可以将图像的像素坐标转换为lat,long吗
- 在 OpenGL 中将笛卡尔世界坐标转换为球面局部坐标
- 如何将鼠标坐标转换为"mm"
- 如何将 QTabWidget 坐标转换为其子坐标?
- 将 2D 图像坐标转换为 z = 0 的 3D 世界坐标
- 如何将世界坐标转换为相机图像坐标
- 将鼠标坐标转换为世界空间坐标
- 将画布坐标转换为外部微件的坐标
- 将 2D 屏幕坐标转换为 3D 世界坐标
- 如何将像素坐标转换为世界坐标
- 如何从 GLUT 坐标转换为窗口坐标
- 将点云的坐标转换为点云库中的另一个坐标,从而使地平面成为X-O-Y平面?
- 将 X Y 坐标转换为拉特长等距柱状投影C++
- 将 3D 坐标转换为 3ds 中的 2D 最大值
- 将屏幕鼠标坐标转换为窗口坐标
- Opengl 屏幕到地图坐标转换
- 在 OpenGL 中将 3D 坐标转换为屏幕坐标
- 将双点坐标转换为字符串
- gluUnProject试图将鼠标坐标转换为opengl坐标的奇怪行为
- 从视口坐标转换为[-1,1]^2顶点[ENGGL]