C++的模板的一个有趣的地方是,模板可以有在模板中没有引用到的参数。
如:
template <class MyStruct, int n>
class pointer {
public:
MyStruct *p;
};
这里有个n没有引用到。这就引起了一些奇怪的问题。pointer <MyStruct, 0>和pointer <MyStruct, 1>既然是同一个东西,这里放个n有什么意义呢?
这次,我们想做个双向链表。双向链表有两个指针,所以要继承pointer两次。不幸的是C++的多重继承不允许对同一个类继承两次。所以用了个n来区分。这样就可以了。
struct MyStruct: pointer<MyStruct, 0> , pointer<MyStruct,1>{
int val;
};
现在可以看一看效果:
int main()
{
MyStruct my[10];
int i;
pointer<MyStruct, 1> p;
pointer<MyStruct, 0> q;
for(i=0; i<10; i++) {
my[i].val=i;
my[i].pointer<MyStruct,0>::p = &my[i-1];
my[i].pointer<MyStruct,1>::p = &my[i+1];
}
my[9].pointer<MyStruct,1>::p=0;
my[0].pointer<MyStruct,0>::p=0;
p.p = &my[0];
while (p.p) {
printf("%d ", p.p->val);
p.p = p.p->pointer<MyStruct, 1>::p;
}
printf("\n");
q.p = &my[9];
while(q.p) {
printf("%d ", q.p->val);
q.p = q.p->pointer<MyStruct, 0>::p;
}
printf("\n");
}
既然pointer<MyStruct, 0>和pointer<MyStruct, 1>代表同样的东西,继续琢摩一下它们之间的赋值运算是有趣的,它是一个模板函数:
template<int m>
pointer & operator=(const pointer<MyStruct, m> &rhsp)
{
p =rhsp.p;
return *this;
}
最后的代码是这样子:
#include <stdio.h>
template <class MyStruct, int id>
class pointer {
public:
MyStruct *p;
template<int m>
pointer & operator=(const pointer<MyStruct, m> &rhsp)
{
p =rhsp.p;
return *this;
}
};
struct MyStruct: pointer<MyStruct, 0> , pointer<MyStruct,1>
{
int val;
};
int main()
{
MyStruct my[10];
int i;
pointer<MyStruct, 1> p;
pointer<MyStruct, 0> q;
for(i=0; i<10; i++) {
my[i].val=i;
my[i].pointer<MyStruct,0>::p = &my[i-1];
my[i].pointer<MyStruct,1>::p = &my[i+1];
}
my[9].pointer<MyStruct,1>::p=0;
my[0].pointer<MyStruct,0>::p=0;
p.p = &my[0];
while (p.p) {
printf("%d ", p.p->val);
p = *p.p;
}
printf("\n");
q.p = &my[9];
while(q.p) {
printf("%d ", q.p->val);
q = *q.p;
}
printf("\n");
}