2011-07-17 39 views
5

我想編寫一個管理euclidean向量並使用short,int,long或float存儲其初始點的類。我想創建一個這樣的模板:模板 - 在必要時使用int,short或float的類

template<class unit> class EVector 
{ 
private: 
    unit x; 
    unit y; 
public: 
    EVector(); 
    setX(); 
    setY(); 
}; 

因此,用戶創建一個EVector,選擇合適的原始類型。但是,我怎樣才能在不同的類之間實現操作,例如

EVector<int> a; 
EVector<float> b; 

EVector<double> c; 

c = a + b; 

operator =將複製座標,operator +添加它們。

+0

這個問題似乎踩在類似的地面http://stackoverflow.com/questions/1629829/ambiguous-overload-on-template-operators它可能對你有用。 – Bart

+0

那麼問題是什麼? –

回答

3

對於另外,你可以用我的promote實現:

template<typename A, typename B> 
EVector<typename promote<A, B>::type> 
operator +(EVector<A> const& a, EVector<B> const& b) { 
    EVector<typename promote<A, B>::type> ev; 
    ev.setX(a.getX() + b.getX()); 
    ev.setY(a.getY() + b.getY()); 
    return ev; 
} 

對於類型doubleint,它會產生double例如。

+0

因此,此解決方案不會考慮所有轉換,只會考慮促銷活動。不知道這是OP想要的。不過,我喜歡這個推廣實現,所以,這裏是我的+1;) –

+0

@Armen所有的轉換都是'?:'做的,如果我沒有弄錯的話,所有轉換歸結爲所有轉換:)例如'char *'和'std :: string'也可以工作,即使這不是任何形式的提升。 「提升」這個名字可能會被重新命名。感謝您的+1 :) –

+0

如果它適用於所有轉換,那麼當簡單的模板副本構造函數和複製分配可以執行時,這些可怕代碼的需求是什麼? –

2

如果您想啓用分配(和拷貝構造)從EVector<U>EVector<T>U可以轉換爲T

template<class T> 
class EVector 
{ 
    template<class U> 
    EVector(EVector<U> const & rhs) 
      :x(rhs.x), y(rhs.y) 
    { 
    } 
    ... 
} 

請注意,即使你已經提供了這個模板拷貝構造函數,編譯器會生成一個複製構造函數(當TU相同時)。在這種情況下,您可以使用該默認實現 - 它完全符合您的需求。但除此之外,你也必須明確地定義非模板構造函數(和複製賦值)。

+0

「請注意,一旦你提供了這個模板化的複製構造函數,你也必須明確地提供一個無模板的構造函數」,這是不正確的:) –

+0

@Johannes:爲什麼不呢? :) –

+0

@Johannes:哦,好吧,我明白了......現在我會考慮如何編輯...... :) –

相關問題