sort ejemplo codigo c++ c++11 vector sizeof value-type

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.