C++ 11中unique_ptr的向量

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)

演示