Les gammes arrivent en C ++ avec la version standard C ++ 20.
Ma question: serons-nous en mesure de construire des conteneurs de bibliothèque standard (existants) avec n'importe quelle gamme? Et plus important encore, avec des vues de portée?
Par exemple, cela va-t-il:
#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;
}
être un programme valide qui imprime 9 16 25
?
Cela se compile avec la bibliothèque range-v3 , pour ce que ça vaut.
Réponses:
Non. Le seul composant de bibliothèque standard pouvant être construit à partir d'une plage arbitraire répondant aux critères appropriés est
std::span<T>
.La direction dans laquelle la bibliothèque standard ira probablement est celle vers laquelle range-v3 va également (notez que l'exemple lié de range-v3 se compile mais met en garde contre une conversion obsolète) - en utilisant un assistant pour effectuer des conversions pour vous:
Une des raisons de ne pas aller dans le sens des constructeurs de plage peut être vue dans l'exemple même que vous utilisez:
Considérez à quel point cette déclaration est différente de ces deux:
v
serait nécessairement unvector<transform_view<...>>
contenant un seultransform_view
, tandis quew
serait unvector<int>
.De plus, l'ajout de constructeurs de conteneurs plus restreints avec soin à la bibliothèque standard ne va de toute façon pas aider les types de conteneurs tiers - alors qu'une installation comme
ranges::to
fonctionne parfaitement dans tous les cas.la source
v
etw
me semblent identiques. Peut-être que vous vouliez déclarerw
commevector<int>
. Sinon, c'est la bonne réponse.v
etw
sont différents? Cela a-t-il quelque chose à voir avec le fonctionnement de la déduction des arguments du modèle constructeur?