As faixas estão chegando ao C ++ com a versão padrão do C ++ 20.
Minha pergunta: Seremos capazes de construir contêineres de biblioteca padrão (existentes) com qualquer intervalo? E mais importante, com vistas de alcance?
Por exemplo, isso será:
#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 um programa válido que imprime 9 16 25
?
Isso compila com a biblioteca de range-v3 , pelo que vale a pena.
Respostas:
Não. O único componente da biblioteca padrão que é construtível a partir de um intervalo arbitrário que atende aos critérios corretos é
std::span<T>
.A direção que a biblioteca padrão provavelmente seguirá é a que o range-v3 também está seguindo (observe que o exemplo vinculado do range-v3 é compilado, mas avisa sobre uma conversão obsoleta) - usando um auxiliar para fazer conversões para você:
Um dos motivos para não seguir a direção dos construtores de intervalo pode ser visto no próprio exemplo que você está usando:
Considere o quão diferente é essa declaração dessas duas:
v
seria necessariamente umvector<transform_view<...>>
contendo um únicotransform_view
, enquantow
seria umvector<int>
.Além disso, adicionar mais construtores de contêineres cuidadosamente restritos à biblioteca padrão não ajudará de qualquer maneira os tipos de contêineres de terceiros - enquanto uma instalação como
ranges::to
funciona perfeitamente bem em todos os casos.fonte
v
ew
têm a mesma aparência para mim. Talvez você pretenda declararw
comovector<int>
. Caso contrário, esta é a resposta correta.v
ew
é diferente? Tem algo a ver com como funciona a dedução de argumento do modelo de construtor?