Совокупная инициализация до C ++ 17 - PullRequest
0 голосов
/ 07 июня 2018

Рассмотрим следующую иерархию классов, составленную из агрегатов:

struct Foo {
    int k;
    double d;
};

struct Bar : Foo {
    int i;
};

Теперь, скажем, я хотел бы инициализировать объект типа Bar из объекта типа Foo, предоставив дополнительный аргумент для i,(По причине скучного обсуждения здесь, добавление конструктора к Bar, который принимает Foo и int, или изменение определения Bar или Foo любым другим способом не подлежит обсуждению).В 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.

1 Ответ

0 голосов
/ 07 июня 2018
auto make(const Foo& f) {
  Bar b;
  static_cast<Foo&>(b) = f;
  b.i = 42;
  return b;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...