【目标】创建一个模板类PointBase,模板信息包括坐标点的类型和维数
【参考】
1、《C++ Primer》 16.1.5节
2、《C++中通过模板向函数传递数组长度》: http://www.bianceng.cn/Programming/cplus/201104/26505.htm
【实现】
0、场景描述:想要创建一个“点”的基类,由于有2维点(x, y),3维点(x, y, z),齐次坐标点(x, y, z, w),所以想要创建一个基类
1、基本原理:见参考1,C++中模板的信息可以包括非类型的信息。
另外,对于函数而言,使用 “数组的引用”作为参数,本身就会包括长度信息,不等长的同类型数组,会被认为是不同的类型。即
void foo(int (&array)[2]){}
void foo(int (&array)[3]){}
构成重载。
2、比较纠结的是复制控制函数的写法。如何在这个模板类中,使用一个使用完全相同模板的类型作为形参?
这个问题应该很弱智,不过纠结了很久。最终的结论是形参完全不用特化即可。。。
代码如下:
template <class CoodType, int CoodNum>
class PointBase {
public :
//variables
CoodType * valueArray;
//construct
PointBase(): valueArray(new CoodType[CoodNum]) {}
//copy control
//作为形参不需要指明类型
void deepClone(const PointBase & rval) {
//deep copy
for (int i = 0; i < CoodNum; i ++)
valueArray[i] = rVal.valueArray[i];
}
PointBase(const PointBase & rVal) {
deepClone(rVal);
}
PointBase & operator = (const PointBase & rVal) {
deepClone(rVal);
return *this;
}
~PointBase() {
delete [] valueArray;
}
};
class SDLPoint : public PointBase<GLfloat, 3> {
public :
GLfloat & x;
GLfloat & y;
GLfloat & z;
SDLPoint(): x(valueArray[0]), y(valueArray[1]), z(valueArray[2]) {
for (int i = 0; i < 3; i ++)
valueArray[i] = 0;
}
};
打完收工