类型之间的转换
Conversion between types
这是一个关于类设计的问题。我对编译器将如何处理这两个类感到困惑。作为一种面向对象的语言,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
编译成的确切代码。所以最终你只有一个向量加法
- 构造函数和转换运算符之间的重载解析
- C ++中无符号位长度类型之间的隐式转换,即uint8_t,uint16_t
- 模板转换运算符在 clang 6 和 clang 7 之间的区别
- 派生类(构造函数具有参数)和基类(构造函数缺少参数)之间没有可行的转换
- Cxx.jl 在 Julia Complex 和 std::complex 之间进行转换
- 如何在 std::string 和 Aws::String 之间进行转换?
- 转换字符时Arduino DUE 和 Arduino UNO 之间的区别
- 如何使用静态多态性在 int 和指针类型之间进行转换?
- 指向 POD 类型的指针之间的静态转换与重新解释转换
- 在 Rcpp 中的字符串类型之间转换时出错
- 如何声明不同类型的模板化类之间的转换
- C 和 C++ 中的函数指针转换之间的差异
- 与浮点转换之间的规范化整数
- 重新解释强制转换和 C 样式转换之间的 C++ 区别
- C++ get 和类型转换之间的用法有什么区别?我应该使用哪一个?
- printf函数参数之间的序列点;转换之间的顺序点是否重要
- Clang和GCC中不明确基类转换之间的行为差异
- 转换之间的双和字节数组,为传输ZigBee API
- 隐式转换和显式转换之间的区别
- interpret_cast和C样式强制转换之间的区别是什么