如何在C++03中使用初始化列表初始化数组成员?
C03替代C11数组成员初始化方案
以下代码在C11中可正常编译运行,但在C03中会报错:
struct Foo { int a, b; Foo(int a, int b) : a(a), b(b) {} }; struct Bar { Foo foos[2]; Bar(int i) : foos{ {i + 1, i + 2}, {i + 2, i + 3} }, {} }; int main() {}
问题:有没有适用于C++03的替代实现?我需要通过Bar的构造参数来初始化数组中的Foo成员,之前见过类似问题但没解决我的场景。
可行的C++03实现方案
C03不支持C11的列表初始化语法,也没法在构造函数初始化列表中直接调用数组元素的带参构造函数,这里提供几种适配方案:
方案1:借助placement new手动构造数组元素
如果不能修改Foo的定义(比如无法添加默认构造函数),可以用placement new直接在预留内存上构造Foo对象:
#include <new> // 必须包含此头文件 struct Foo { int a, b; Foo(int a, int b) : a(a), b(b) {} }; struct Bar { // 预留足够存储两个Foo对象的内存空间 char _foos_buf[sizeof(Foo) * 2]; Foo* foos; Bar(int i) { foos = reinterpret_cast<Foo*>(_foos_buf); // 手动调用Foo的带参构造函数初始化每个元素 new (foos) Foo(i + 1, i + 2); new (foos + 1) Foo(i + 2, i + 3); } // 手动调用析构函数清理资源 ~Bar() { foos[1].~Foo(); foos[0].~Foo(); } }; int main() {}
方案2:给Foo添加默认构造函数后赋值
如果允许修改Foo的定义,添加一个无参默认构造函数,就可以在Bar的构造函数体内直接赋值:
struct Foo { int a, b; Foo() {} // 添加无参默认构造函数 Foo(int a, int b) : a(a), b(b) {} }; struct Bar { Foo foos[2]; Bar(int i) { foos[0] = Foo(i + 1, i + 2); foos[1] = Foo(i + 2, i + 3); } }; int main() {}
方案3:用静态辅助函数生成初始化后的数组容器
如果不想用placement new,也可以用临时结构体包裹数组,通过静态函数初始化后赋值:
struct Foo { int a, b; Foo(int a, int b) : a(a), b(b) {} }; struct Bar { Foo foos[2]; // 静态辅助函数:根据参数生成初始化好的Foo数组 static struct FooArray { Foo arr[2]; } make_foos(int i) { FooArray temp; // 依赖Foo的默认拷贝构造函数(编译器会自动生成) temp.arr[0] = Foo(i + 1, i + 2); temp.arr[1] = Foo(i + 2, i + 3); return temp; } Bar(int i) { FooArray temp = make_foos(i); foos[0] = temp.arr[0]; foos[1] = temp.arr[1]; } }; int main() {}
内容的提问来源于stack exchange,提问作者nowox
相关产品推荐
相关产品推荐

