构造类成员std :: vector <std :: unique_ptr <AClass>的智能方法

火焰

这个问题将unique_ptr组合为类成员,并且移动语义无法使用构造函数中的clangC ++ std :: vector进行编译

我的目标是构造一个包装器

struct V_wrapper{
       std::vector<std::unique_ptr<AClass> > vec;
       V_wrapper(std::vector<std::unique_ptr<AClass> > v) : vec{std::move(v)} {}
};

不幸的是,该代码无法编译,因为编译器(clang Apple LLVM版本4.2)试图复制构造v不支持的向量另一方面,如果我为设计一个中间包装器std::unique_ptr<AClass>,如下所示

struct P_wrapper{
       std::unique_ptr<AClass> Ptr;
       P_wrapper(std::unique_ptr<AClass>& p) : Ptr(std::move(p)) {}
};

并如下编写V_wrapper

struct V_wrapper{
       std::vector<P_wrapper > vec;
       V_wrapper(std::vector<P_wrapper > v) : vec{std::move(v)} {}
};

那我就没问题 我认为(强调),这样做的原因是向量的构造函数意识到您应该使用引用来移动而不是尝试复制,就像在unique_ptr中作为类成员一样,移动语义无法用clang编译

不幸的是,这导致了我制作std::vector<std::unique_ptr<AClass> >,使用它来构造P_wrapper,并最终使用它来构造的相当不便的构造过程V_wrapper我觉得中间步骤应该是完全多余的!此外,它使界面更难以阅读。包装器的全部重点是向用户隐藏的实现vec,现在有一个莫名其妙的(不知道源代码)对象P_wrapper仅用于构造另一个对象。

我想避免这种情况,并且只有一个包装器。有什么办法可以减少中间人的工作,让我回到第一个更简单的实现上V_wrapper吗?

克瑞克(Kerrek SB)

不要随意使用大括号激励器;std::vector有一个使用构造函数列表的构造函数。编写此代码的明显方法对我来说很好:

#include <memory>    // for std::unique_ptr
#include <utility>   // for std::move
#include <vector>    // for std::vector

struct bar {};

struct foo
{
    using vtype = std::vector<std::unique_ptr<bar>>;
    foo(vtype v) : _v(std::move(v)) { }
private:
    vtype _v;
};

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何构造一个具有“unique_ptr”作为成员变量的对象的“std::vector”?

将std :: vector <std :: unique_ptr <int>>的所有权转移到正在构造的类的正确方法

调整大小std :: vector <std :: unique_ptr <T >>的性能

std :: vector <std :: unique_ptr <int>>不编译

C ++-vector <>中的std :: unique_ptr为nullptr

是否可以使用fill构造函数创建std :: vector <std :: unique_ptr <Bar >>?

声明包含std :: unique_ptr的结构的std :: vector类时出错

将std :: vector <std :: unique_ptr <T >>分配给另一个std :: vector <std :: unique_ptr <T >>

如何调整std :: vector <std :: queue <std :: unique_ptr <int >>>的大小?

std :: remove_if来自std :: vector的多态std :: unique_ptr

将std :: unique_ptr类成员标记为const

std :: unique_ptr constexpr构造函数

std :: unique_ptr构造函数的行为

具有显式析构函数和std :: unique_ptr <>成员的类不能在std :: vector <>中使用吗?

将std :: unique_ptr推回std :: vector时,编译器不会失败

'operator[]' 不匹配(操作数类型是 'std::unique_ptr<std::vector<int> >' 和 'int')

如何检查std :: unique_ptr是否为空(如果它位于std :: vector中)?

还有什么更好的替代std :: vector <std :: unique_ptr <T >>吗?

使用`std :: unique_ptr`时`std :: vector`中的数据不同

std :: vector <std :: unique_ptr <>> :: push_back()的正确语法是什么?

使用std :: vector <double>访问由std :: unique_ptr <double [2]>管理的数据

std :: unique_ptr :: release()与std :: move()

std :: unique_ptr与std :: map

类中的类似于std :: map或std :: vector的构造方法

如何使用std :: vector <unique_ptr <T >>作为默认参数

std :: vector <unique_ptr <class T >>的动态初始化

如何获取智能指针数组的大小?(例如std :: unique_ptr <int []>)

错误C2248:'std :: unique_ptr <_Ty> :: unique_ptr':无法访问在类'std :: unique_ptr <_Ty>'中声明的私有成员

从类方法返回成员unique_ptr