如何移动TArray的内容

3

在C++中,我可以做到

class A
{
public:
    A(std::vector<std::unique_ptr<int>> v) : _v(std::move(v)) {}
private:
    std::vector<std::unique_ptr<int>> _v;
}

我如何使用UE4类型(TArrayTUniquePtr)实现类似的功能,即如何移动TArray的内容?


完整示例:

#include <cassert>
#include <memory>
#include <vector>
class MyObj {};
class A {
 public:
  A(std::vector<std::unique_ptr<MyObj>> v) : _v(std::move(v)) {}
  auto GetV() { return _v.front().get(); }

 private:
  std::vector<std::unique_ptr<MyObj>> _v;
};

int main() {
  auto v = std::vector<std::unique_ptr<MyObj>>();
  v.push_back(std::make_unique<MyObj>());
  A a(std::move(v));
  assert(a.GetV());
}

通过实践!你遇到了一些问题吗?你应该解释一下那个问题是什么。 - undefined
1
你试过了吗,看看发生了什么?有没有出现错误?有没有发生你预期中的事情? - undefined
我要求你把问题的焦点放在使用虚幻类型和移动语义上,告诉我们实际遇到的问题。如果你不能做到这一点,那就是离题的,可能会被关闭! - undefined
那么问题就是离题的,直到你阅读了文档(Brennan表明答案在TArray参考中很容易找到),尝试实现你的目标,并且遇到了实际的问题。干杯。 - undefined
好的,谢谢你的反馈。:-) - undefined
显示剩余4条评论
2个回答

5

TArray有一个移动构造函数(即其签名为TArray(TArray &&other)),可以在这里看到。

因此,std::moveTArray上的工作方式应与在std::vector上的工作方式相同。


2
TUniquePtr还具有移动构造函数:TUniquePtr(TUniquePtr && Other) - undefined

4
为了完成 Brennan的答案
C++ std -> UE4 等效:
- std::vector -> TArray - std::unique_ptr -> TUniquePtr - std::make_unique -> MakeUnique - std::move -> MoveTempIfPossible (使用MoveTemp获取rvalues和const的编译时检查)
因此,使用本机UE4类的代码示例如下:
class MyObj {};
class A {
 public:
  A(TArray<TUniquePtr<MyObj>> v) : _v(MoveTemp(v)) {}
  auto GetV() { return _v[0].Get(); }

 private:
  TArray<TUniquePtr<MyObj>> _v;
};

int main() {
  auto o = MyObj{};
  auto v = TArray<TUniquePtr<MyObj>>();
  v.Add(MakeUnique<MyObj>(o));
  A a(MoveTemp(v));
  assert(a.GetV());
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接