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;
No es estático, pero es un constexpr
http://www.cplusplus.com/reference/array/array/size/
EDIT: esto puede no ser un error, eche un vistazo a este error utilizando un constexpr como un parámetro de plantilla dentro de la misma clase
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>& );
- Demostración: http://ideone.com/R4k1vG
¡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.