by Anonymous » 27 Feb 2025, 03:58
Wir möchten einen Baum mit Elementen implementieren: < /p>
Code: Select all
+----------------------+
| Item (interface) |
+----------------------+
| + getName(): string |-----------+
+----------------------+ |
^ |
| |
+------+------+ |
| | |
+-------------+ +------------+ |
| SimpleItem | | Group |--+
+-------------+ +------------+
| +add(Item) |
| +all() |
+------------+
Die Group :: All () Funktion muss eine abgeflachte rekursive Ansicht aller Elemente wie Selbstpaare zurückgeben: {Recursion Level, Element}. Elemente ist nicht der gleiche Typ wie Eine Ansicht der Elemente ).
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);
}
})
)
);
}
Code:
https://compiler-explorer.com/z/fdc8rswae
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.
Wir möchten einen Baum mit Elementen implementieren: < /p>
[code] +----------------------+
| Item (interface) |
+----------------------+
| + getName(): string |-----------+
+----------------------+ |
^ |
| |
+------+------+ |
| | |
+-------------+ +------------+ |
| SimpleItem | | Group |--+
+-------------+ +------------+
| +add(Item) |
| +all() |
+------------+
[/code]
Die Group :: All () Funktion muss eine abgeflachte rekursive Ansicht aller Elemente wie Selbstpaare zurückgeben: {Recursion Level, Element}. Elemente ist nicht der gleiche Typ wie Eine Ansicht der Elemente ).[code]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);
}
})
)
);
}
[/code]
Code: https://compiler-explorer.com/z/fdc8rswae
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.