考虑最简单的情况。首先,我们来写个只有一个元素的vector
class vector{
int ob;
public:
int v;
int &operator[](int i) {
if (i==0) { return v;}
else {printf("out-of-bound\n"); return ob; }
}
};
这是main()函数
int main()
{
vector v;
v[0]=100;
printf("%d\n", v[0]);
}
如果vector含有两个元素,就这样写:
class vector1:public vector{
public:
int more;
int &operator[](int i) {
if (i==1) { return more;}
else return vector::operator[](i);
}
};
如果有三个元素,
class vector2:public vector1{
public:
int more;
int &operator[](int i) {
if (i==2) { return more;}
else return vector1::operator[](i);
}
};
如果含有四个元素… …,代码无限膨胀了,这样行不通… …
哦,这里应该使用模板!你会想。于是,代码变成这样:
#include <stdio.h>
template <class T, int n>
class vector:public vector<T,n-1>{
public:
T more;
T &operator[](int i) {
if (i==n) { return more;}
else return vector<T,n-1>::operator[](i);
}
};
template <class T>
class vector<T, 0>{
T ob;
public:
T v;
T &operator[](int i) {
if (i==0) { return v;}
else {printf("out-of-bound\n"); return ob; }
}
};
int main()
{
vector<int,2> v;
v[0]=100;
v[1]=200;
v[2]=300;
printf("%d\n", v[0]);
printf("%d\n", v[1]);
printf("%d\n", v[2]);
}
程序巧妙的使用了模板和偏特化的特性实现了模板从n…到0的递归。然而语法用的复杂,并没有使功能变得更强。反而产生了又大又慢的代码。这只不过相当于把循环展开来写。由此可知,过早的" Thinking in C++“并不可取。