如何移动 TArray 的内容

How to move the contents of TArray

本文关键字:TArray 移动 何移动      更新时间:2023-10-16

在我能做的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());
}

TArray有一个移动构造函数(即签名为 TArray(TArray &&other) 的构造函数(,如下所示。

因此,std::move应该以与std::vector相同的方式处理TArray

完成布伦南的回答:

C++ std -> UE4 等效项:

  • std::vector -> TArray
  • std::unique_ptr -> TUniquePtr
  • std::make_unique -> MakeUnique
  • std::move -> MoveTempIfPossible(使用 MoveTemp 获取右值和常量的编译时检查(

因此,上面使用原生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());
}