设为首页 加入收藏

TOP

4.8.7 下标操作符
2013-10-07 15:01:11 来源: 作者: 【 】 浏览:73
Tags:4.8.7 操作

4.8.7  下标操作符

operators库使用indexable提供了下标操作符[]的支持,它也属于解引用的范畴,用法与dereferenceable很相似,类摘要如下:

  1. template <class T, class I, class R, class B > 
  2. struct indexable : B  
  3. {  
  4.   R operator[](I n) const;  
  5. };   

indexable模板参数列表中的T和B含义与dereferenceable的T和B含义相同,分别是子类类型和基类链的父类类型。

参数I是下标操作符的值类型,通常应该是整数,但也可以是其他类型,只要它能够与类型T做加法操作。参数R是operator[]的返回值类型,通常应该是一个类型的引用。

indexable要求子类提供一个operator+(T, I)的操作定义,类似于一个指针的算术运算,它应该返回一个迭代器类型,能够使用operator*解引用得到R类型的值。

与dereferenceable的例子类似,我们使用一个my_smart_array类来模仿实现scoped_array。my_smart_array从indexable公开继承,下标操作符类型是int,operator[]的返回值类型是T&:

  1. template<typename T> 
  2. class my_smart_array:   
  3.     public indexable<my_smart_array<T>, int, T& > 
  4. {  
  5.     T *p;                                           //保存动态数组指针  
  6. public:  
  7.     typedef my_smart_array<T> this_type;  
  8.     typedef T*      iter_type;                      //迭代器类型  
  9.     my_smart_array(T *x):p(x){}                     //构造函数  
  10.     ~my_smart_array(){delete[] p;}                  //析构函数  
  11.     friend iter_type operator+(const this_type& a, int n)  
  12.     {  
  13.         return a.p + n;                     //返回一个迭代器,可以使用operator*操作  
  14.     }  
  15. };  

由于my_smart_array实现了operator+,因此它支持算术运算,又由于它继承自indexable,所以它还自动获得了operator[]的定义:
  1. my_smart_array<double> ma(new double[10]);  
  2. ma[0] = 1.0;                                //operator[]  
  3. *(ma + 1) = 2.0;                            //指针算术运算  
  4. cout << ma[1] << endl;                  //输出2.0  

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇4.9.1 标准库中的异常 下一篇4.8.8 高级议题

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: