2012-10-31 73 views
1

所以我有這兩個重載操作符爲我的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; 
} 

在這樣的機會中,有一種方法可以做到這一點很棒,它有可能嗎?

+0

你到底想如何複製它們? – 0x499602D2

+0

由於點積依賴於對稱雙線性形式的選擇以及Hodge星上的交叉乘積,所以我不會重載其中的任何一個,而是使操作明確。 –

+0

http://stackoverflow.com/questions/9568852/overloading-by-return-type – alestanis

回答

5

您不能在返回類型超載。

您有幾種選擇:

  • 使用免費的功能dot(v1, v2);
  • 濫用另一個對您的班級沒有意義的二元運算符(例如v1^v2)作爲點或交叉運算符(請注意,優先級可能不是您想要的);
  • 濫用配對操作符和對象來構造適當的語法(例如v1 <dot> v2,使用<>運算符和全局對象dot)。
+0

呃我從來沒有想過最後一點......+1 –

+0

值得一提的是,還有另外一種可能性,即對轉換運算符使用助手類,但是要正確使用它非常冗長而棘手。有關更多信息,請參閱@aleguna的答案。 – abarnert

+0

對於關於''語法的小說第三點+1(儘管我認爲它非常不切實際,很好學習一個新技巧)。另一方面,該列表缺少代理轉換答案,就像在@ aleguna的答案中一樣。儘管我不會選擇這個問題,但它確實適用於更普遍的情況,例如,對於標準C++「屬性」。 –

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; 
+0

這有很多錯誤,例如在免費的操作符重載時使用「this」 。 – imreal

+0

並且還在運營商內部使用'return return'。 –

+0

它不是自由運算符,它是在OP的Vector3類中定義的 – 2012-10-31 18:17:58

相關問題