c++ - 类型之间的转换

标签 c++ operator-overloading type-conversion

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

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

Point3 上的操作非常有限,但在数学中,我们可以通过从 Origin 中减去 Point3 来从 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个float来表示的。在运行时,它应该判断它是 Point3 还是 Vector3,但编译器应该关心类型而不是处理器。

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

谢谢

** 更新 ** 为了更加关注问题,这可以通过转换构造函数或转换来完成。运营商。内部其实是一样的。编译器是否能够看到槽并优化掉,我想通过内联,那些构造函数和转换运算符。

最佳答案

执行此操作的最简单方法是将点坐标作为 vector 在内部存储。因为我不知道 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;
}

现在,p += v 将被优化为 p.position += v 如果 position不是私有(private)的。所以最终你只有一个 vector 加法。

关于c++ - 类型之间的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17002821/

相关文章:

c++ - 无法通过 SSL 将示例程序绑定(bind)到 LDAP 服务器(ldaps ://)

c++ - 从解析/读取整个文本文件到逐行解析/读取

C++ : Polymorphism and operator overloading

c++ - 为什么我可以在运算符 += 的右侧使用初始化列表而不是运算符 +?

c++ - 在 C++ 中使用整数和对象重载运算符

c++ - 将字符缓冲区转换为结构

c++ - 使适用于旧 C 字符串 (char*, int) 的函数适用于 std::string&

c++ - 实现自定义 Windows 身份验证包

c - 从 "0x4000"(例如)字符串获取十六进制值并将其存储在变量中。

C# 重载属性