Wit*_*tek 13 c++ unique-ptr c++11
我最近切换到C++ 11,我试图习惯那里的良好实践.我最终经常处理的是:
class Owner
{
private:
vector<unique_ptr<HeavyResource>> _vectorOfHeavyResources;
public:
virtual const vector<const HeavyResource*>* GetVectorOfResources() const;
};
Run Code Online (Sandbox Code Playgroud)
这需要我做一些事情,比如添加一个_returnableVector并翻译源向量以便以后能够返回它:
_returnableVector = vector<HeavyResource*>;
for (int i=0; i< _vectorOfHeavyResources.size(); i++)
{
_returnableVector.push_back(_vectorOfHeavyResources[i].get());
}
Run Code Online (Sandbox Code Playgroud)
有人注意到类似的问题吗?您有什么想法和解决方案?我是否在这里获得了所有的所有权想法?
更新:还有另外一件事:如果一个类返回某些处理的结果vector<unique_ptr<HeavyResource>>(它将结果的所有权传递给调用者)会怎样,并且它应该用于某些后续处理:
vector<unique_ptr<HeavyResource>> partialResult = _processor1.Process();
// translation
auto result = _processor2.Process(translatedPartialResult); // the argument of process is vector<const HeavyResource*>
Run Code Online (Sandbox Code Playgroud)
Tar*_*ama 16
我建议不要维护和返回一个未修改的unique_ptr向量,而是提供直接访问元素的函数.这封装了资源的存储空间; 客户不知道他们是存储为unique_ptrs,也不知道他们被保存在vector.
一种可能性是使用自动boost::indirect_iterator解除引用unique_ptr:
using ResourceIterator =
boost::indirect_iterator<std::vector<std::unique_ptr<HeavyResource>>::iterator,
const HeavyResource>;
ResourceIterator begin() { return std::begin(_vectorOfHeavyResources); }
ResourceIterator end() { return std::end(_vectorOfHeavyResources); }
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
14032 次 |
| 最近记录: |