考虑以下由聚合组成的类层次结构:
struct Foo {
int k;
double d;
};
struct Bar : Foo {
int i;
};
现在,假设我想从 Foo 类型的对象初始化 Bar 类型的对象,为i
. (由于这里讨论的乏味,添加一个构造函数Bar
接受Foo
和int
,Bar
或Foo
以任何其他方式修改 or 的定义是不可能的)。在 C++17 中,我会使用聚合初始化:
auto make(const Foo& f) {
return Bar{f, 42};
}
这在 C++14 中不可用。我还能做些什么来模仿 C++14 中的期望行为吗?我试图避免类似的事情
auto make(const Foo& f) {
Bar b;
b.k = f.k;
b.d = f.d;
b.i = 42;
return b; // or return Bar{f.k, f.d, 42};
}
我要避免的事情是make
了解内部结构Foo
- 即make
知道如何初始化 的额外成员很好Bar
,但不希望初始化Bar
与Foo
.