gpt4 book ai didi

c++ - 如何定义表示二维坐标的模板之间的转换?

转载 作者:行者123 更新时间:2023-11-28 02:32:57 25 4
gpt4 key购买 nike

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

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

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

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 限制此构造函数,以确保转换是您想要允许的。

关于c++ - 如何定义表示二维坐标的模板之间的转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28477883/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com