Mit der C ++ 20-Standardversion kommen Bereiche nach C ++.
Meine Frage: Werden wir in der Lage sein, (vorhandene) Standardbibliothekscontainer mit einem beliebigen Bereich zu erstellen? Und was noch wichtiger ist, mit Entfernungsansichten?
Zum Beispiel wird dies:
#include <vector>
#include <iostream>
#include <ranges>
int main() {
auto sq = [](int x) { return x * x; };
std::vector<int> vec { 3, 4, 5 };
std::vector<int> squares { std::ranges::views::transform(vec, sq) };
for(auto i : squares) { std::cout << i << ' '; }
std::cout << std::endl;
}
ein gültiges Programm sein, das druckt 9 16 25
?
Dies wird mit der range-v3-Bibliothek kompiliert , was das wert ist.
Antworten:
Nein. Die einzige Standardbibliothekskomponente, die aus einem beliebigen Bereich konstruierbar ist, der die richtigen Kriterien erfüllt, ist
std::span<T>
.Die Richtung, in die die Standardbibliothek wahrscheinlich gehen wird, ist die Richtung, in die sich range-v3 ebenfalls bewegt (beachten Sie, dass das verknüpfte Beispiel aus range-v3 zwar kompiliert wird, aber vor einer veralteten Konvertierung warnt) - Verwenden eines Hilfsprogramms , um Konvertierungen für Sie durchzuführen:
Einer der Gründe, nicht in die Richtung von Bereichskonstruktoren zu gehen, ist aus dem Beispiel ersichtlich, das Sie verwenden:
Überlegen Sie, wie unterschiedlich diese Erklärung von diesen beiden ist:
v
wäre notwendigerweise eine,vector<transform_view<...>>
die eine Single enthälttransform_view
, währendw
einevector<int>
.Darüber hinaus hilft das Hinzufügen weiterer, sorgfältig eingeschränkter Containerkonstruktoren zur Standardbibliothek ohnehin nicht den Containertypen von Drittanbietern - während eine Einrichtung wie diese
ranges::to
in allen Fällen einwandfrei funktioniert.quelle
v
undw
sehen für mich gleich aus. Vielleicht wollten Sie sichw
alsvector<int>
. Ansonsten ist dies die richtige Antwort.v
undw
sind anders? Hat dies etwas damit zu tun, wie die Ableitung von Konstruktorvorlagenargumenten funktioniert?