Рассмотрим следующую иерархию классов, составленную из агрегатов:
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
.