Код: Выделить всё
+----------------------+
| Item (interface) |
+----------------------+
| + getName(): string |-----------+
+----------------------+ |
^ |
| |
+------+------+ |
| | |
+-------------+ +------------+ |
| SimpleItem | | Group |--+
+-------------+ +------------+
| +add(Item) |
| +all() |
+------------+
Реализация с использованием диапазонов :: siews , как возвращаемый тип . элементы не тот же тип, что и представление элементов ).
Таким образом, этот код не компилируется:
Код: Выделить всё
auto all(size_t level = 0) const {
return views::concat(
views::single(std::pair(level, shared_from_this())),
views::join(items |
views::transform([level](const auto& item) {
auto group = std::dynamic_pointer_cast(item);
if (group == nullptr) {
return views::single(std::pair{level + 1, item});
}
else {
return group->all(level + 1);
}
})
)
);
}
Любая идея, как сделать all функциональный работа и вернуть желаемый сплюснутый вид всех рекурсивных элементов? concat , который добавляется в std :: jarges только в C ++ 26. Решения могут полагаться либо на std :: janges, либо на диапазоны-V3.
Подробнее здесь: https://stackoverflow.com/questions/794 ... rsive-view
Мобильная версия