有没有办法让两个重载运算符的副本返回不同的类型?

时间:2012-10-31 18:00:22

标签: 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;
}

在失败的情况下有一种方法可以做到这一点很棒,是不是很有可能?

2 个答案:

答案 0 :(得分:6)

简答:不可能

答案很长:你可以做点什么

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;

答案 1 :(得分:5)

您不能在返回类型上重载。

您有几个选择:

  • 使用免费功能dot(v1, v2);
  • 滥用另一个对您的班级没有意义的二元运算符(例如v1 ^ v2)作为点或交叉运算符(请注意,优先级可能不是您想要的);
  • 滥用配对的运算符和对象构建适当的语法(例如v1 <dot> v2,使用<>运算符以及全局dot对象。