【问题标题】:How to move the contents of TArray如何移动 TArray 的内容
【发布时间】:2019-04-23 21:27:49
【问题描述】:

在 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());
}

【问题讨论】:

  • 做吧!你遇到什么问题了吗?你应该解释那个问题是什么。
  • @LightnessRacesinOrbit 问题是,ue4 建议使用它的类而不是 std(尽管 std 可以在大多数使用 ue4 的平台上编译和运行),而且它是否以及哪些类作为替代品对我来说并不明显对于问题中所述的标准。
  • 你试过看看发生了什么吗?你有什么错误吗?有没有出乎你意料的事情发生?
  • @LightnessRacesinOrbit 不,它与std 配合得很好。但是坚持Coding standard of a code base 同样重要,因为单个开发人员无法监督对整个程序的影响(在我的机器上工作不是一个好的推理) - 如果您想进行更多讨论,请在聊天中打我。
  • 我要求您通过实际告诉我们使用 Unreal 类型和移动语义的问题来提出您的问题。如果你不能这样做,那就是题外话,可能会被关闭!

标签: c++ unreal-engine4


【解决方案1】:

完成the answer of Brennan

C++ 标准 -> 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());
}

【讨论】:

    【解决方案2】:

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

    所以std::move 应该以与std::vector 相同的方式在TArray 上工作。

    【讨论】:

    • TUniquePtr 也有一个移动构造函数:TUniquePtr(TUniquePtr &amp;&amp; Other)
    猜你喜欢
    • 1970-01-01
    • 2013-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-02
    相关资源
    最近更新 更多