Иногда в моем коде мне хочется определить несколько экземпляров одного и того же класса, при этом разница в определении будет небольшой по сравнению с его общей длиной и будет иметь некоторый общий указатель. И я изо всех сил пытаюсь реорганизовать код, чтобы он был компактным и простым в использовании.
Пример: я начинаю с:
auto blue_foo = std::make_unique(n); auto blue_bar = std::make_unique(m); auto blue_baz = std::make_unique(k); Это немного неприятно: повторение команд и префиксов имен...
Я могу поместить эти переменные в структуру с именем blue, чтобы можно было писать
do_stuff_with(blue.foo, blue.baz, 123); а не
do_stuff_with(blue_foo, blue_baz, 123); но - тогда мне понадобится еще больше повторений:
struct { std::unique_ptr foo, bar, baz; } синий = { std::make_unique(n), std::make_unique(m), std::make_unique(k), }; Так расточительно! Мне бы хотелось хотя бы написать что-то вроде:
struct { auto foo, bar, baz; } Фу = { std::make_unique(n), std::make_unique(m), std::make_unique(k), }; но это невозможно.
Кроме того, я не хочу повторять вызов make_unique. Полагаю, я мог бы написать лямбду:
auto make_data = [](std::size_t size) { return std::make_unique(size); } struct { auto foo, bar, baz; } синий = { make_data(n), make_data(m), make_data(k) }; но лямбда требует много написания; и это не особо экономит. И даже в этом есть повторения.
Каков идиоматический подход к тому, чтобы сделать мой первоначальный фрагмент кода компактным и читаемым?
Примечание. В этом примере фрагмент кода не повторяется много раз; только раз. Если бы я неоднократно использовал комбинацию foo, bar и baz, я бы написал класс для их хранения.
Мобильная версия