dla*_*nod 5 c++ stl smart-pointers
智能指针是否可以处理铸造,如果不是,解决此限制的安全方法是什么?
我正在尝试做的一个例子是有两个包含智能指针的STL向量(例如).第一个包含指向基类的智能指针,而第二个包含指向派生类的智能指针.智能指针被引用计数,例如与Boost的shared_ptrs类似的行为,但是手动滚动.我已经包含了一些示例代码,我提供了一个例子:
vector<CBaseSmartPtr> vecBase;
vector<CDerivedSmartPtr> vecDer;
...
CBaseSmartPtr first = vecBase.front();
vecDer.push_back(CDerivedSmartPtr(dynamic_cast<CDerived*>(first.get()));
Run Code Online (Sandbox Code Playgroud)
这似乎不还给我,因为我觉得我结束了两个智能指针管理同一个对象.在轨道的某个点上,这可能会导致其中一个释放对象,而另一个仍然保留对它的引用.
我希望的但不认为会起作用的是一个直接的向下投射,同时保持相同的对象,例如
dynamic_cast<CDerivedSmartPtr>(first)
Run Code Online (Sandbox Code Playgroud)
我是否应该更改第二个容器以仅使用CBaseSmartPtr并仅使用向下转换?还有其他解决方案吗?
智能指针可以处理向下转换,但它不是自动的.并且获得const-correctness可能有点复杂(我在面试问题中使用了我们的智能指针实现,涉及一些模板技巧).但是,智能指针的许多用户无论如何都不会使用const限定类型来实例化他们的智能指针.
你需要弄清楚的第一件事就是柜台.由于您可能需要在smart_ptr<Base>和之间共享计数器smart_ptr<Derived>,因此计数器类型不应该依赖于类型参数.总的来说,这无论如何都不是什么大问题.计数器只是一个size_t,可能包含在一个类中.(注意:有其他智能指针设计,但问题强烈建议使用计数器)
对基地的演员应该是相当微不足道的.因此,你的smart_ptr应该有一个构造函数采用smart_ptr.在这个ctor中,添加一行static_cast<T*>((U*)0);.这不会生成代码,但是当T不是U的基础(模数const限定)时会阻止实例化.
反过来应该是一个明确的演员.你不能以编程方式枚举T的所有基数,因此smart_ptr<T>无法从中得出smart_ptr<Base1_of_T>, smart_ptr<Base2_of_T>, ...因此,a dynamic_cast<smart_ptr<T> >将无效.你可以提供自己的smart_dynamic_cast<SPT>(smart_ptr<U> const& pU).这最好实现为一个函数reting an SPT.在这个功能中,你可以简单地做一个return SPT(dynamic_cast<SPT::value_type*>(&*pU)).
| 归档时间: |
|
| 查看次数: |
4300 次 |
| 最近记录: |