ejemplos descargar definicion compiler caracteristicas c++

c++ - descargar - Obtener el número de elementos en std:: array en tiempo de compilación



c++ manual (4)

¿Es el siguiente un código válido de C ++, y por qué no?

std::array<std::string, 42> a1; std::array<int, a1.size()> a2;

No se compila en GCC 4.8 (en modo C ++ 11). Hay una solución simple pero poco elegante:

std::array<std::string, 42> a1; std::array<int, sizeof(a1)/sizeof(a1[0])> a2;

Así que claramente el compilador puede calcular la cantidad de elementos en std :: array. ¿Por qué std :: array :: size () no es una función constexpr static ?

EDITAR: He encontrado otra solución:

std::array<std::string, 42> a1; std::array<int, std::tuple_size<decltype(a1)>::value> a2;



Puede usar el mismo método de inferencia de plantillas que siempre se ha utilizado para la detección de límite de matriz C ++ 98.

template<size_t N, typename T> constant_integer<N> array_size( const std::array<T, N>& );

¡Haz un bonito envoltorio macro y disfruta!

También son posibles muchas variaciones, tales como:


array<T>::size() es constexpr , pero no puede usarlo de esta manera porque a1 no es un valor constexpr . Además, no puede ser constexpr porque la string no es un tipo literal.

Sin embargo, puede solucionar este problema si lo desea, deduciendo el parámetro de plantilla size_t . Ejemplo:

#include <string> #include <array> #include <iostream> using namespace std; template<typename> struct array_size; template<typename T, size_t N> struct array_size<array<T,N> > { static size_t const size = N; }; array<string, 42> a1; array<string, array_size<decltype(a1)>::size> a2; int main() { cout << a2.size() << endl; }


std::array::size realmente debe ser constexpr según § 23.3.2.1 del estándar C ++ 11:

23.3.2.4 array::size [array.size] template <class T, size_t N> constexpr size_type array<T,N>::size() noexcept; Returns: N

Supongo que esto acaba de deslizarse más allá de quien lo implementó en GCC.

Después de la prueba, esto funciona:

std::array<int, 42> a1; std::array<int, a1.size()> a2;

Esto puede tener algo que ver con que std::string no sea un tipo constexpr válido para crear instancias en tiempo de compilación, mientras que int es.