首页 > 解决方案 > 将向量乘以标量和类型转换 (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;
}

那么上面提到的用例是可能的。为什么?这个怎么运作?

标签: c++ooptemplatesvectoroperator-overloading

解决方案


推荐阅读