c++ - 将向量乘以标量和类型转换 (C++)
问题描述
我正在 3D 空间中实现一个向量:{u, v,w}。我想重载 operator * 以便可以进行以下操作:ResultVector = scalar * Vector。在这个表达式中,我假设ResVector中包含的类型是标量类型和Vector中包含的类型之间最常见的类型。例如,我期望以下类型转换:
int * vector<float> -> vector<float>
complex<float> * vector<float> -> vector<complex>
等等。但我看到我的运算符 * 重载无法正常工作。那么,我应该如何定义 operator* 来提供上面提到的类型转换和其他?
我现在拥有的:
template <typename Scalar>
Vector3<Scalar> operator*(Scalar number, const Vector3<Scalar>& vec1)
{
Vector3<Scalar> tmp(vec1);
tmp *= number;
return tmp;
}
只有当 number 是 Scalar 并且 vec1 包含 Scalar 时,这种重载才有效。此外, operator* 不能这样使用
Vector3<float> vec1(1, 2, 3);
Vector3<float> vec5(2 * vec1);
因为不存在适当的类型转换或未定义接受适当类型的 operator*。但是如果我按以下方式定义 operator*
template <typename Scalar, typename Multiplier=Scalar>
Vector3<Scalar> operator*(Multiplier number, const Vector3<Scalar>& vec1)
{
Vector3<Scalar> tmp(vec1);
tmp *= number;
return tmp;
}
那么上面提到的用例是可能的。为什么?这个怎么运作?
解决方案
推荐阅读
- javascript - 从毫秒转换为持续时间
- jquery - ASP.NET MVC Ajax JSON jQuery 不会将参数发送到“ActionResult”
- python-3.x - 删除熊猫字符串中的特定单词
- javascript - 运行 Angular 7 应用程序时找不到模块“node-sass”
- python - 创建一个包含给定集合大小的子集列表的列表
- go - 去模块 - 替换不起作用 - 没有版本的替换模块必须是目录路径(根或以
- javascript - 如何使用 npm 的 request-promise 在 POST 中添加文件?
- c++ - 用 constexpr 中的联合替换 reinterpret_cast - 好主意吗?
- python - 如何将以下数据结构更改为 numpy 矩阵和 numpy 数组(分别)?
- javascript - ESC / POS 打印忽略前几个命令。使用 nodeJS