c++ - 有没有办法让重载运算符的两个拷贝返回不同的类型?

标签 c++ operators overloading

所以我的 Vector 类有这两个重载运算符,点积和叉积,我假设你不能这样做,我应该有一个叉函数。

inline T operator *(const Vector3<T> &v)
{
    return value[0]*v[0]+value[1]*v[1]+value[2]*v[2];
}

inline Vector3<T> operator *(const Vector3<T> &v)
{
    Vector3<T> result;
    result[0] = value[1]*v[2] - value[2]*v[1]; 
    result[1] = value[2]*v[0] - value[0]*v[2];
    result[2] = value[0]*v[1] - value[1]*v[0];
    return result;
}

如果有一种方法可以很好地做到这一点,这是否可能?

最佳答案

简答:不可能

长答案:你可以做类似的事情

template<class T>
class Product
{
public:
   Product (const Vector3<T> &v1, const Vector3<T> &v2)
       : v1_ (v1), v2_(v2) {}

   operator T () const {/*calc and return a dot product*/}
   operator Vector3<T> () const {/*calc and return a cross product*/}

private:
   const Vector3<T> &v1_;
   const Vector3<T> &v2_;
};

template<class T>
class Vector3
{
...
public:
    inline Product<T> operator *(const Vector3<T> &v)
    {
         return Product<T> (*this, v);
    }
};

// usage
Vector3<int> v1 = {...};
Vector3<int> v2 = {...};

int dot = v1 * v2;
Vector3<int> cross = v1 * v2;

关于c++ - 有没有办法让重载运算符的两个拷贝返回不同的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13164001/

相关文章:

c++ - 是否可以定义一个包含函数和 lambda 的可调用概念?

c++ - 创建 Direct3D12 设备失败并显示 E_NoInterface

c++ - 将一个变量与另一个变量相关联?

c++ - 在 C++ 中使用 char 数组作为数学数字

c++ - 速度差 : separate functor VS operator() inside a big class with *this

java - 方法签名最佳实践 - 重载与长名称

c++ - 非冗长的解决方案,使基于模板类型的类成员变量为可选?

javascript - 有没有办法使比较运算符成为变量?

c++ - 从同一类的两个不同模板拷贝继承时重载

c++ - 为什么 auto 不能用于重载函数?