c++ - ejemplo - ¿Cómo puedo obtener sizeof a vector:: value_type?
mergesort c++ codigo (3)
Quiero obtener sizeof
del tipo que está contenido en un vector. Esto es lo que intenté:
#include <iostream>
#include <vector>
int main()
{
std::vector<uint> vecs;
std::cout << sizeof(vecs.value_type) << std::endl;
return 0;
}
Desde mi entendimiento, esto debería ser correcto. Sin embargo, cuando compilo con GCC 4.8.1, esto es lo que obtengo:
test-sizeof.cpp: In function ‘int main()’: test-sizeof.cpp:7:27: error: invalid use of ‘std::vector<unsigned int>::value_type’ std::cout << sizeof(vecs.value_type) << std::endl; ^
¿Qué estoy haciendo mal? ¿Cómo puedo obtener el tamaño del tipo contenido?
El operador de acceso miembro .
solo se puede usar para acceder a miembros de datos y funciones de miembros de clases, no a otros nombres anidados como nombres de tipos. Necesitará el operador de resolución de alcance ::
para acceder a ellos, y eso solo se puede aplicar al nombre de clase (o un alias), no a un objeto de tipo de clase:
std::vector<uint>::value_type
En C ++ 11 o posterior, decltype
puede darle un nombre de tipo, si tiene un objeto y no tiene acceso conveniente al tipo:
decltype(vecs)::value_type
Los comentarios lo dicen todo: si conoce el tipo de vector, puede usar sizeof(std::vector<uint>::value_type)
. De lo contrario, use sizeof(decltype(vecs)::value_type)
.
decltype
es una construcción mágica de C ++ 11 que evalúa el tipo de su argumento, por lo que el código
int i;
float f;
decltype(i) j;
decltype(f) g;
Es lo mismo que
int i;
float f;
int j;
float g;
Solo usa el .
operador para campos y métodos (técnicamente también se puede usar para variables estáticas, pero se considera una mala práctica). Para cualquier otra cosa, como variables estáticas, clases internas o parámetros de plantilla de ámbito de clase o typedefs (como value_type
), utilice el operador de resolución de ámbito ::
.
3.4.3 Búsqueda de nombres calificados [basic.lookup.qual]
1 El nombre de un miembro de clase o de espacio de nombres o enumerador se puede consultar después de que el operador de resolución de ámbito (5.1) aplique a un especificador de nombre anidado que denota su clase, espacio de nombres o enumeración. Si un operador de resolución :: scope en un especificador de nombre anidado no está precedido por un especificador de tipo decltype, la búsqueda del nombre que precede a eso :: considera solo los espacios de nombres, tipos y plantillas cuyas especializaciones son tipos . Si el nombre encontrado no designa un espacio de nombres o una clase, enumeración o tipo dependiente, el programa está mal formado.
En este caso, está accediendo a un miembro de type
de la especialización de plantilla de clase std::vector<uint>
, y debe hacerlo escribiendo:
std::vector<uint>::value_type
En caso de que en realidad esté dentro del código de plantilla y desee, por ejemplo, acceder al mismo tipo anidado, debe prefijarlo con la palabra clave typename
esta manera:
typename std::vector<T>::value_type
En C ++ 11, puede usar sizeof(decltype(vecs)::value_type)
o también sizeof(decltype(vecs.back()))
, este último es conveniente si no conoce el nombre exacto del tipo pero saber cómo acceder a ellos a través de una función miembro como back()
.
Nota : como señala @Casey en los comentarios, decltype
requiere decltype
referencias para obtener el tipo en sí, pero para el tamaño de los propósitos que no importa.