类型之间的转换

Conversion between types

本文关键字:转换 之间 类型      更新时间:2023-10-16

这是一个关于类设计的问题。我对编译器将如何处理这两个类感到困惑。作为一种面向对象的语言,c++需要优化抽象层或类型抽象来提高效率。我能想到的一个例子就是迭代器。它们与指针是完全不同的类型,但编译器可以优化,例如在for循环中与指针一样高效。

我关心的是如果这两个类是一个的话,如何使它们同样有效。这两个类是Point3和Vector3的数学表示。

对Point3的操作确实有限,但在数学中,我们可以通过从原点减去Point3来得到一个Vector3。我们也可以反其道而行,把Vector3的末端看作一个点3。

这方面的一个例子是缩放一个点3。

Point3<float> positionStart;
Vector3<float> scale;
Point3<float> positionEnd;
positionEnd = scale * positionStart;

这应该将positionStart Point3转换为Vector3,进行乘法运算,然后将临时Vector3的终点赋值给positionEnd

我们如何在c++中高效地编写这些代码,使这些转换实际上不会发生。因为在最后,Point3和Vector3由3个浮点数表示。在运行时,应该区分它是Point3还是Vector3,但编译器应该关心的是类型,而不是处理器。

我希望这是清楚的,如果我没有更好地解释我的困惑。

感谢

**更新**为了更专注于这个问题,可以使用转换构造函数或转换。操作符。内部是一样的。我猜,通过内联,编译器能够看到并优化那些构造函数和转换操作符吗?

最简单的方法是将点坐标作为矢量存储在内部。因为我不知道operator*会做什么,我将用operator+显示它,其中语义清晰(请注意,这是未经测试的代码):

template<typename Field> class Point
{
public:
  Point& operator+=(Vector<Field> const& v);
  // the rest of the Point interface
private:
  Vector<Field> position; // holds the vector from the origin to this point
};
template<typename Field>
 inline Point<Field>::operator+=(Vector<Field> const& v)
{
  position += v;
}
template<typename Field>
 inline Point<Field> operator+(Point<Field> p, Vector<Field> const& v)
{
  return p += v;
}

现在,如果position不是私有的,p += v将被优化为p.position += v编译成的确切代码。所以最终你只有一个向量加法