Рассмотрим следующую иерархию классов, состоящую из агрегатов:
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.
@NicolBol: ну, некоторые из функций включают, в то время как другие просто сокращают накладные расходы на синтаксис (например, выражения свертки могут быть реализованы в C++ 14 с немного большим количеством наборов текста, но с той же семантикой). Я ищу возможный способ сделать то же самое, возможно, с большим количеством наборов текста, но с той же семантикой.





auto make(const Foo& f) {
Bar b;
static_cast<Foo&>(b) = f;
b.i = 42;
return b;
}
Идеально. Как мне жаль, что я этого не вижу.
Если бы существовал способ имитировать его, не делая его неагрегированным, зачем бы они добавляли его в стандарт C++ 17?