0

考虑以下由聚合组成的类层次结构:

struct Foo {
    int k;
    double d;
};

struct Bar : Foo {
    int i;
};

现在,假设我想从 Foo 类型的对象初始化 Bar 类型的对象,为i. (由于这里讨论的乏味,添加一个构造函数Bar接受FoointBarFoo以任何其他方式修改 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,但不希望初始化BarFoo.

4

1 回答 1

4
auto make(const Foo& f) {
  Bar b;
  static_cast<Foo&>(b) = f;
  b.i = 42;
  return b;
}
于 2018-06-07T15:10:12.023 回答