4.8.6 解引用操作符
operators库使用dereferenceable提供了对解引用操作符*、->的支持,它的用法与之前介绍的算术操作符不太相同。
dereferenceable的类摘要如下:
- template <class T, class P, class B = ...>
- struct dereferenceable : B
- {
- P operator->() const;
- };
dereferenceable有三个模板参数:
第一个参数T是要实现operator->的子类,它的含义与算术操作符类相同;
第二个参数P是operator->所返回的类型,也就是指针类型,通常应该是T*;
最后一个参数B是用于基类链技术的父类,实际使用时我们不需要关心。
dereferenceable类要求子类提供operator*,会自动实现operator->。注意它的operator->函数的定义,不是如其他算术操作符类那样的友元函数,因此在使用dereferenceable时必须使用public继承,否则operator->将会成为类的私有成员函数,外界无法访问。
由于dereferenceable实现了解引用操作符的语义,因此它可以用于实现自定义的智能指针类,或者是实现代理模式,包装代理某些对象。
例如,下面的代码实现了一个简单的智能指针类my_smart_ptr,它public继承了dereferenceable,重载operator*并自动获得了operator->的定义:
- template<typename T>
- class my_smart_ptr:
- public dereferenceable<my_smart_ptr<T>, T* > //必须public继承
- {
- T *p; //内部保存的指针
- public:
- my_smart_ptr(T *x):p(x){} //构造函数
- ~my_smart_ptr(){delete p;} //析构函数
- T& operator*() const //operator*定义,必须是常函数
- { return *p; }
- };
my_smart_ptr的用法就像是scoped_ptr:- my_smart_ptr<string > p(new string("123"));
- assert(p->size() == 3);