【发布时间】:2018-12-27 09:22:53
【问题描述】:
我有一个带有非默认构造函数的类Object,以及一个包含Objects 数组的类ManyObjects。该数组应由用户使用构造函数的参数进行初始化。
然后有一个类ManyObjectsWrapper,它继承自ManyObjects,并且还期望一个数组来初始化ManyObjects。
这是我目前正在使用的代码。
代码
#include <iostream>
#define PRINTFN() std::cout << __PRETTY_FUNCTION__ << std::endl
class Object {
public:
Object(int number) : number(number) { PRINTFN(); }
Object(Object &&o) : number(std::move(o.number)) { PRINTFN(); }
// Object(Object&&) = default;
void print() { std::cout << "The number is " << number << std::endl; }
private:
const int number;
};
template <size_t N>
class ManyObjects {
public:
ManyObjects(Object(&&objects)[N]) : objects(std::move(objects)) {}
void print() {
for (Object &object : objects)
object.print();
}
private:
Object objects[N];
};
template <size_t N>
class ManyObjectsWrapper : public ManyObjects<N> {
public:
ManyObjectsWrapper(Object(&&objects)[N])
: ManyObjects<N>(std::forward<Object[N]>(objects)) {}
};
int main() {
ManyObjectsWrapper<3> wrapper = {{1, 2, 3}};
wrapper.print();
}
输出
Object::Object(int)
Object::Object(int)
Object::Object(int)
Object::Object(Object&&)
Object::Object(Object&&)
Object::Object(Object&&)
The number is 1
The number is 2
The number is 3
它可以工作,而且输出看起来还不错,但我不确定我对右值引用和std::forward 和std::move 的使用是否正确。
尤其是ManyObjects::objects的初始化使用objects(std::move(objects))。
有人可以对此发表评论吗?
编辑
一些说明:我将它与不支持 STL 的微控制器平台一起使用。我可以通过手动移植来移植像std::forward 这样的简单编译时构造。但是,我不能使用像 std::vector 这样的动态容器,因为它们使用堆,我必须在我使用的受限硬件上避免这种情况。
我希望将依赖项保持在最低限度,并且我不想浪费时间移植大部分 STL(例如std::array)。
主要目标是能够调用ManyObjectsWrapper<3> wrapper = {{1, 2, 3}};,其中参数始终是整数文字列表。
【问题讨论】:
-
阅读this,它包含与他们合作所需的一切。
-
@Ron,我不明白你的意思,你能详细说明一下吗?简单地将
std::move替换为std::forward不会编译。 -
想知道为什么 gcc 编译
ManyObjects(Object(&&objects)[N]) : objects(std::move(objects)) {}C 数组是不可复制/移动的。 -
@Jarod42,确实,在那条线上当场哽咽,但 gcc(Ubuntu 5.4.0-6ubuntu1~16.04.10)编译并运行良好。有更好的方法的想法吗?
-
std::array<Object, N>与 C 数组相反,是可复制/可移动的(但时间很短)。
标签: c++ move-semantics