Los rangos están llegando a C ++ con la versión estándar C ++ 20.
Mi pregunta: ¿podremos construir contenedores de biblioteca estándar (existentes) con algún rango? Y lo más importante, ¿con vistas de rango?
Por ejemplo, esto:
#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;
}
ser un programa válido que imprime 9 16 25
?
Esto compila con la biblioteca Range-v3 , por lo que vale.
Respuestas:
No. El único componente de biblioteca estándar que es construible a partir de un rango arbitrario que cumple con los criterios correctos es
std::span<T>
.La dirección con la que probablemente irá la biblioteca estándar es hacia la que también se dirige range-v3 (tenga en cuenta que el ejemplo vinculado de range-v3 sí se compila pero advierte sobre una conversión en desuso): usar un ayudante para realizar conversiones por usted:
Una de las razones para no ir en la dirección de los constructores de rango se puede ver desde el mismo ejemplo que está utilizando:
Considere cuán diferente es esa declaración de estos dos:
v
necesariamente sería un quevector<transform_view<...>>
contiene un solotransform_view
, mientrasw
que sería unvector<int>
.Además, agregar más constructores de contenedores cuidadosamente restringidos a la biblioteca estándar no ayudará a los tipos de contenedores de terceros de todos modos, mientras que una instalación como
ranges::to
funciona perfectamente bien en todos los casos.fuente
v
y mew
parecen iguales. Quizás quisiste declararw
como avector<int>
. De lo contrario, esta es la respuesta correcta.v
yw
son diferentes? ¿Tiene algo que ver con cómo funciona la deducción de argumentos de plantilla de constructor?