C++的模板(二):未用到的模板参数

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");
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值