考虑以下类聚合,由聚合构成:
struct Foo {
int k;
double d;
};
struct Bar : Foo {
int i;
};
现在,让我们说我想从类型为Foo的对象初始化Bar类型的对象,为i
提供额外的参数。 (有理由在这里讨论沉闷,将构造函数添加到接受Bar
和Foo
的{{1}},或修改任何其他int
或Bar
的定义方式是不可能的)。在C ++ 17中,我将使用聚合初始化:
Foo
这在C ++ 14中不可用。我还能做些什么来模仿C ++ 14中所需的行为吗?我试图避免像
这样的事情auto make(const Foo& f) {
return Bar{f, 42};
}
我想避免的事情是让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
成员。
答案 0 :(得分:4)
auto make(const Foo& f) {
Bar b;
static_cast<Foo&>(b) = f;
b.i = 42;
return b;
}