聚合初始化前C ++ 17

时间:2018-06-07 14:52:55

标签: c++ c++14 aggregate-initialization

考虑以下类聚合,由聚合构成:

struct Foo {
    int k;
    double d;
};

struct Bar : Foo {
    int i;
};

现在,让我们说我想从类型为Foo的对象初始化Bar类型的对象,为i提供额外的参数。 (有理由在这里讨论沉闷,将构造函数添加到接受BarFoo的{​​{1}},或修改任何其他intBar的定义方式是不可能的)。在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成员。

1 个答案:

答案 0 :(得分:4)

auto make(const Foo& f) {
  Bar b;
  static_cast<Foo&>(b) = f;
  b.i = 42;
  return b;
}