2012-10-16 74 views
6

我想編寫一個數學矢量模板。我有一個接受類型和大小作爲模板參數的類,有很多數學運算方法。 現在我想寫的專業化,其中矢量< 3>例如有x,y,z作爲分別引用data [0..3]的成員。C++ - 使用默認模板作爲專業化的基礎

問題是,我不知道如何創建一個專門化,它繼承了默認模板中的所有內容,而無需創建基類或將所有內容寫入兩次。

什麼是最有效的方法來做到這一點?

template<class Type, size_t Size> 
class Vector { 
    // stuff 
}; 

template<class T> 
class Vector<3,T>: public Vector { 
    public: 
     T &x, &y, &z; 
     Vector(): Vector<>(), x(data[0]), y(data[1]), z(data[2]){} 
     // and so on 
}; 
+2

創建基類是典型的方法。 –

回答

7

不知何故,你應該能夠從默認實現中派生出來,但是你正在專門研究一個實例,那麼怎麼做?它應該是一個非專業版本,您可以從中獲得它。所以這是簡單的:

// Add one extra argument to keep non-specialized version! 
template<class Type, size_t Size, bool Temp = true> 
class Vector { 
    // stuff 
}; 
// And now our specialized version derive from non-specialized version! 
template<class T> 
class Vector<T, 3, true>: public Vector<T, 3, false> { 
    public: 
     T &x, &y, &z; 
     Vector(): Vector<>(), x(data[0]), y(data[1]), z(data[2]){} 
     // and so on 
}; 
+0

雖然這很好用,但在外部接口中有一個內部模板參數似乎有點笨重(對我來說)。 – Cameron

+0

用戶永遠不會使用這個額外的模板參數,當然你還有另外一個選項,專門的和默認的實現都是從包含實際實現的基類派生的!但在我看來,這比這種技術更難! – BigBoss

+0

@BigBoss很好,謝謝。 – weltensturm

1

考慮制定這一點不同的方式,但目標一定會實現,添加外部接口 - 我的意思是獨立的函數X(),Y(),Z():

template<class T, size_t S> 
T& x(Vector<T, S>& obj, typename std::enable_if<(S>=1)>::type* = nullptr) 
{ 
    return obj.data[0]; 
} 

template<class T, size_t S> 
T& y(Vector<T, S>& obj, typename std::enable_if<(S>=2)>::type* = nullptr) 
{ 
    return obj.data[1]; 
} 

template<class T, size_t S> 
T& z(Vector<T, S>& obj, typename std::enable_if<(S>=3)>::type* = nullptr) 
{ 
    return obj.data[2]; 
} 

之間並沒有很大的區別:

Vector<T, 3>& obj 
return obj.x(); 

而且

Vector<T, 3>& obj 
return x(obj); 

作爲獎勵 - 此界面適用於匹配大小。