如果你想通用接口,定義構造函數有4個參數,並專注了。在內部,僅初始化這些成員,這是有效的,這種規模的載體:
template <>
Vector<1>::Vector(int _x, int _y, int _z, int _w)
: x(_x) //1D vector has only 'x'
{
}
template <>
Vector<2>::Vector(int _x, int _y, int _z, int _w)
: x(_x)
, y(_y) //2D vector has 'x' and 'y'
{
}
等。但是這是醜陋的,迫使你你做一些事情「共同」,例如,你將持有甚至4
組件2D vector
。有解決方法(用作成員變量的模板化結構,專門針對每個大小的向量),但這非常複雜。由於不同大小的矢量實際上不同類型,我會去滿級的專業化:
template<int size>
class Vector;
template<>
class Vector<1>
{
protected:
int x;
public:
Vector(int _x)
: x(_x)
{ }
//other members
};
template<>
class Vector<2>
{
protected:
int x, y;
public:
Vector(int _x, int _y)
: x(_x)
, y(_y)
{ }
//other members
};
然後你就可以使用這種方式:
Vector<1> v_1(2);
Vector<2> v_2(4, 6);
//etc...
此外,第二個解決方案將允許客戶端你的矢量實例化它只爲那些size
s,你明確允許。
你的類'矢量<2>'是完全無關的矢量''<3>,他們是不同類型的。對於每個模板實例化,都正在定義一個構造函數,所以你沒問題。可能你想做別的事情,因爲我沒有看到你在任何地方使用'size'。如果是這樣,請澄清問題。 – vsoftco
感謝回覆我得到了我的答案。 – user3877301