Guías de deducción para std::span
De cppreference.com
<tbody>
</tbody>
| Definido en el archivo de encabezado <span>
|
||
template <class It, class EndOrSize> span(It, EndOrSize) -> span<std::remove_reference_t<std::iter_reference_t<It>>>; |
(1) | |
template<class T, std::size_t N> span(T (&)[N]) -> span<T, N>; |
(2) | |
template<class T, std::size_t N> span(std::array<T, N>&) -> span<T, N>; |
(3) | |
template<class T, std::size_t N> span(const std::array<T, N>&) -> span<const T, N>; |
(4) | |
template<class R> span(R&&) -> span<std::remove_reference_t<std::ranges::range_reference_t<R>>>; |
(5) | |
Se proporcionan las siguientes guías de deducción para span.
(1) permite que se deduzca el tipo de elemento a partir del par iterador-centinela. Esta sobrecarga solo participa en la resolución de sobrecargas si It satisface a contiguous_iterator.
(2-4) permite que se deduzca el alcance estático a partir de arrays integrados y std::array.
(5) permite que se deduzca el tipo de elemento a partir de rangos. Esta sobrecarga solo participa en la resolución de sobrecargas si R satisface a contiguous_iterator
Ejemplo
Ejecuta este código
#include <array>
#include <cstddef>
#include <iomanip>
#include <iostream>
#include <span>
#include <string_view>
#include <vector>
void imprimir(std::string_view rem = "", std::size_t size_of = 0, std::size_t alcance = 0) {
if (rem.empty()) {
std::cout << "nombre │ sizeof │ alcance\n─────────┼────────┼────────\n";
return;
}
std::cout << std::setw(4) << rem << " │ " << std::setw(6) << size_of << " │ ";
if (alcance == std::dynamic_extent)
std::cout << "dinámico";
else
std::cout << alcance;
std::cout << '\n';
}
int main() {
int a[] {1, 2, 3, 4, 5};
imprimir();
std::span s1 {std::begin(a), std::end(a)}; // guía (1)
imprimir("s1", sizeof s1, s1.extent);
std::span s2 {std::begin(a), 3}; // guía (1)
imprimir("s2", sizeof s2, s2.extent);
std::span s3 {a}; // guía (2)
imprimir("s3", sizeof s3, s3.extent);
std::span<int> s4 {a}; // no usar una guía, genera un lapso dinámico
imprimir("s4", sizeof s4, s4.extent);
std::array arr {6, 7, 8};
std::span s5 {arr}; // guía (3)
imprimir("s5", sizeof s5, s5.extent);
s5[0] = 42; // de acuerdo, element_type es 'int'
const std::array arr2 {9, 10, 11};
std::span s6 {arr2}; // guía (4)
imprimir("s6", sizeof s6, s6.extent);
// s6[0] = 42; // ERROR: element_type es 'const int'
std::vector v {66, 69, 99};
std::span s7 {v}; // guía (5)
imprimir("s7", sizeof s7, s7.extent);
}
Salida:
nombre │ sizeof │ alcance
───────┼────────┼────────
s1 │ 16 │ dinámico
s2 │ 16 │ dinámico
s3 │ 8 │ 5
s4 │ 16 │ dinámico
s5 │ 8 │ 3
s6 │ 8 │ 3
s7 │ 16 │ dinámico