在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类型(TArray
,TUniquePtr
)相似的东西,即如何移动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());
}
答案 0 :(得分:3)
drwxrwxrwx. 2 nfriberg nfriberg 40 Dec 19 22:16 cache
-rw-r--r--. 1 nfriberg nfriberg 0 Dec 19 23:32 config.php
drwxrwxr-x. 2 nfriberg nfriberg 40 Dec 19 22:16 files
drwxr-xr-x. 2 nfriberg nfriberg 40 Dec 19 22:16 images/avatars/upload
drwxrwxrwx. 2 nfriberg nfriberg 40 Dec 19 22:16 store
具有移动构造函数(即,签名为TArray
的构造函数),如here所示。
因此TArray(TArray &&other)
应该在std::move
上工作,就像在TArray
上工作一样。
答案 1 :(得分:2)
C ++ std-> UE4等效项:
std::vector
-> TArray
std::unique_ptr
-> TUniquePtr
std::make_unique
-> MakeUnique
std::move
-> MoveTempIfPossible
(使用MoveTemp
获取右值和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());
}