[英]C++ - Use default template as base for specialization
我想寫一個數學矢量模板。 我有一個接受類型和大小作為模板參數的類,有很多數學運算方法。 現在我想編寫專門化,其中Vector <3>例如x,y,z作為成員分別引用數據[0..3]。
問題是我不知道如何創建一個從默認模板繼承所有內容的特化,而無需創建基類或編寫所有內容兩次。
最有效的方法是什么?
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
};
不知何故,你應該能夠從默認實現派生,但你是專門的實例,那么如何? 它應該是一個非專業版本,您可以從中派生出來。 這很簡單:
// 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
};
考慮以稍微不同的方式進行此操作,但目標將實現,添加外部接口 - 我的意思是獨立函數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);
作為獎勵 - 此界面適用於匹配大小。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.