Code: Select all
+----------------------+
| Item (interface) |
+----------------------+
| + getName(): string |-----------+
+----------------------+ |
^ |
| |
+------+------+ |
| | |
+-------------+ +------------+ |
| SimpleItem | | Group |--+
+-------------+ +------------+
| +add(Item) |
| +all() |
+------------+
Code: Select all
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);
}
})
)
);
}
Jede Idee, wie man das alles funktioniert, und die gewünschte Überabansicht von allen überholten Elementen zurückgibt. concat , das nur in C ++ 26 zu std :: ranges hinzugefügt wird. Lösungen können entweder auf std :: Bereiche oder auf Ranges-V3 beruhen.