gpt4 book ai didi

c++ - 构造类成员 std::vector> 的聪明方法

转载 作者:太空宇宙 更新时间:2023-11-04 11:51:56 25 4
gpt4 key购买 nike

这个问题结合了unique_ptr as class member and move semantics fail to compile with clangC++ std::vector in constructor .

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

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 版)试图复制构造 vector 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)} {}
};

那我就没问题了。我认为(强调)这样做的原因是 vector 的构造函数意识到您应该使用引用来移动而不是尝试复制,就像在 unique_ptr as class member and move semantics fail to compile with clang 中一样。 .

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

我想避免这种情况,并且只有一个包装器。有什么办法可以去掉中间人,这样我就可以回到第一个更简单的 V_wrapper 实现?

最佳答案

不要随意使用大括号初始化器; 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;
};

关于c++ - 构造类成员 std::vector<std::unique_ptr<AClass>> 的聪明方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17833238/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com