类型之间的转换

时间:2013-06-08 19:00:22

标签: c++ operator-overloading type-conversion

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

我关心的是如果这两个类只有一个,那么如何使这两个类有效。这两个类是Point3和Vector3的数学表示。

Point3上的操作确实有限,但在数学上我们可以通过从Origin中减去它来从Point3中创建一个Vector3。我们也可以通过将Vector3的结尾视为Point3来做对位。

这样做的一个例子是缩放Point3。

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

positionEnd = scale * positionStart;

这应该将positionStart Point3转换为Vector3,进行乘法,然后取临时Vector3的终点,将其分配给positionEnd

我们如何在C ++中有效地编码,以便实际上不会发生这些转换。因为最终Point3和Vector3由3个浮点数表示。在运行时,如果它是Point3或Vector3,它应该是mather,但编译器应该关心的类型而不是处理器。

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

感谢

**更新** 为了更多地关注问题,可以使用转换构造函数或转换来完成。运营商。内部实际上是相同的。编译器是否能够看到低谷并优化出来,我想通过内联,那些构造函数和转换运算符。

1 个答案:

答案 0 :(得分:1)

最简单的方法是将点坐标作为向量存储在内部。由于我不知道operator*会做什么,我会用operator+显示,其中sematics是明确的(请注意,这是未经测试的代码):

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;
}

现在,如果p += v不是私有的,p.position += v将针对position编译到的确切代码进行优化。所以最终你只有一个向量添加。