Sie können auf diese Weise keine Ansichten erstellen. Das Verketten einer Ansicht ergibt ein Objekt mit einem anderen Typ. Sie können es nicht der ursprünglichen Ansicht zuweisen, da sein Typ anders ist.
Sie können den Effekt sind Sie erhalten, nachdem sie mit einer Kombination aus view::cycle
(nimmt einen Bereich und wiederholt es unendlich) und view::take
(nimmt die ersten N Elemente eines Bereichs).
vector<int> const & v{foo()}; // returns a reference
auto rng = v | view::cycle | view::take(5 * v.size());
EDIT
Wenn foo()
jedes Mal einen Verweis auf einen anderen Vektor zurückkehren können, dann können Sie view::generate
und view::join
, zusätzlich zu view::take
verwenden:
auto rng = view::generate(foo) | view::take(5) | view::join;
Welche ist ' newRange' und können wir die 'foo()' Funktion sehen? Auch wofür ist "v"? – Galik
@Galik Ich habe den Code aktualisiert. Die Funktion 'foo()' gibt eine const-Referenz zurück, ist aber für meine Frage nicht relevant. – nikitablack
Ich denke, das ist ziemlich schwierig mit den Bereichen zu tun. Betrachte n Bereiche mit verschiedenen Elementen. Nun zeigen ein begin() und end() des Gesamtbereichs auf() des ersten und end() des letzten, und dazwischen muss er verfolgen, ob wir am Ende des k-ten Bereichs sind, und gehe zu (k + 1). '' view :: concat'' zur Kompilierzeit erreicht dies mit ziemlich viel Maschinerie. – skgbanga