Æle*_*lex 0 vector copy-constructor unique-ptr c++11
我有一个graph有成员的班级:
std::vector<std::unique_ptr<layer>> _layers;
Run Code Online (Sandbox Code Playgroud)
我理解其性质std::unique_ptr是不可复制的.我的graph::graph(const graph & rhs);拷贝构造函数产生编译错误,因为我的普通实现违反了本质std::unique_ptr.
graph::graph(const graph & rhs)
: _layers(rhs._layers) {}
Run Code Online (Sandbox Code Playgroud)
如果我这样做,std::move那么我将违反param 的常量rhs,这不是我想要的.我知道我可以制作深层副本(例如,为存储的每个对象创建新的唯一指针rhs._layers)但除了迭代每个项目rhs._layers并分配新的唯一指针之外,还有一些优雅的方法吗?
gcc/g ++是c ++ 11而不是c ++ 14
我目前的解决方案是深度复制对象并分配新指针:
graph::graph(const graph & rhs)
{
for (const auto & ptr : rhs._layers)
_layers.emplace_back(std::unique_ptr<layer>(new layer(*ptr)));
}
Run Code Online (Sandbox Code Playgroud)
最优雅的解决方案是使用STL:
graph::graph(const graph & rhs)
{
_layers.reserve(rhs._layers.size());
std::transform(
std::begin(rhs._layers),
std::end(rhs._layers),
std::back_inserter(_layers),
[](const std::unique_ptr<layer>& uptr) {
return std::unique_ptr<layer>{uptr ? new layer{*uptr} : nullptr};
});
}
Run Code Online (Sandbox Code Playgroud)
std::transform, std::back_inserter
| 归档时间: |
|
| 查看次数: |
1269 次 |
| 最近记录: |