【C/C++ 语法备忘】1、非类型模板类


【目标】创建一个模板类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;
    }

};

打完收工

你可能感兴趣的:(C++)