3.4.9 高级议题

2013-10-07 13:13:24 · 作者: · 浏览: 64

3.4.9  高级议题

本小节讨论关于shared_ptr的一些高级议题。

  1. shared_ptr<void> 

shared_ptr<void>能够存储void*型的指针,而void*型指针可以指向任意类型,因此shared_ptr<void>就像是一个泛型的指针容器,拥有容纳任意类型的能力。

但将指针存储为void*同时也丧失了原来的类型信息,为了在需要的时候正确使用,可以用static_pointer_cast<T>等转型函数重新转为原来的指针。但这涉及到运行时动态类型转换,它会使代码不够安全,建议最好不要这样使用。

删除器的高级用法

基于shared_ptr<void>和定制删除器,shared_ptr可以有更惊人的用法。由于空指针可以是任何指针类型,因此shared_ptr<void>还可以实现退出作用域时调用任意函数。例如:

  1. void any_func(void* p)                      //一个可执行任意功能的函数  
  2. {   cout << "some operate" << endl;}  
  3. int main()  
  4. {  
  5.     shared_ptr<void> p((void*)0,any_func);      //容纳空指针,定制删除器  

shared_ptr<void>存储了一个空指针,并指定了删除器是操作void*的一个函数,因此当它析构时会自动调用函数any_func(),从而执行任意我们想做的工作。

其他高级用法

shared_ptr的功能已经远远超出了智能指针的范围,除了以上的用法外它还有很多其他用途,如包装成员函数、延时释放等,限于篇幅本书不作详细介绍,读者可参考Boost说明文档。