Do C ++ zbliżają się nowe wersje ze standardową wersją C ++ 20.
Moje pytanie: Czy będziemy w stanie zbudować (istniejące) kontenery biblioteki standardowej o dowolnym zakresie? A co ważniejsze, z widokami zasięgu?
Na przykład czy to:
#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;
}
być poprawnym programem, który drukuje 9 16 25
?
To kompiluje się z biblioteką zakresów-v3 , co jest tego warte.
Odpowiedzi:
Nie. Jedynym standardowym składnikiem biblioteki, który można zbudować z dowolnego zakresu, który spełnia poprawne kryteria, jest
std::span<T>
.Kierunek, w którym prawdopodobnie pójdzie standardowa biblioteka, to ten, w którym zmierza również zakres v3 (zauważ, że połączony przykład z zakresu v3 kompiluje się, ale ostrzega przed przestarzałą konwersją) - używając pomocnika do wykonania konwersji dla Ciebie:
Jednym z powodów, dla których nie należy iść w kierunku konstruktorów zasięgu, jest sam przykład, którego używasz:
Zastanów się, jak różni się ta deklaracja od tych dwóch:
v
byłoby koniecznievector<transform_view<...>>
zawierać singieltransform_view
, podczas gdyw
byłobyvector<int>
.Co więcej, dodanie większej liczby starannie skonstruowanych konstruktorów kontenerów do standardowej biblioteki i tak nie pomoże żadnym innym typom kontenerów - podczas gdy takie obiekty
ranges::to
działają doskonale doskonale we wszystkich przypadkach.źródło
v
iw
dla mnie wyglądają tak samo. Być może chciałeś zadeklarowaćw
jakovector<int>
. W przeciwnym razie jest to poprawna odpowiedź.v
i czymw
się różnią? Czy ma to coś wspólnego z tym, jak działa dedukcja argumentów z szablonu konstruktora?