¿cómo puedo obtener el tipo de elementos que están contenidos en un contenedor STL?verificar el tipo de elemento en el contenedor stl - C++
Respuesta
Para los envases en general, será X::value_type
. Para contenedores asociativos será X::mapped_type
(X::value_type
corresponde a pair<const Key,T>
). Está de acuerdo con el Capítulo 23 de C++ Standard.
Para comprobar que los tipos son iguales, puede usar boost::is_same
.
container::value_type
bien eso ya es genial, pero no puedo comparar dos tipos de valores devueltos por container :: value_type. ¿alguna sugerencia? –
@Patrick: no puede comparar los "valores devueltos por value_type" porque value_type es un tipo, no un valor. La comparación de dos value_types es, por lo tanto, una operación estática, no una de tiempo de ejecución. Dependiendo de lo que esté tratando de lograr, es posible que desee ver "is_same" en Boost.TypeTraits: http://www.boost.org/doc/libs/1_40_0/libs/type_traits/doc/html/boost_typetraits/reference /is_same.html –
@Patrick: solicitó el * tipo * de elementos almacenados en el vector, no el * valor * de los elementos. Puede comparar los valores, no puede comparar tipos (al menos no sin muchos trucos de metaprogramación); quizás deba explicar qué es lo que está tratando de hacer. – jalf
¿En qué sentido? ¿Quizás usando RTTI y typeid()?
Probablemente usted tiene que utilizar contenedores :: valuetype donde envase es el nombre de su contenedor (por ejemplo, std :: vector)
Alek
Necesita darnos más contexto. Si quiere decir que quiere el valor conocido en tiempo de compilación para que sea fácil cambiarlo, use container::value_type
.
typedef vector<int> coordinates;
coordinates seq;
fib::value_type elem = seq.back(); // it's easy to change int type
Si lo que quiere decir es que el contenedor puede contener varios tipos de hormigón (derivados) y desea saber en tiempo de ejecución a continuación, probablemente debería reevaluar su enfoque. En la programación orientada a objetos, ocultar el tipo en tiempo de ejecución a veces es un enfoque poderoso, porque significa que usted hace menos suposiciones sobre con qué está trabajando. Por supuesto, puede usar RTTI, pero probablemente haya una mejor manera: necesitaríamos más contexto para contar.
Si desea comparar tipos, probablemente esté dirigiendo el camino de tiempo de ejecución. C++ es compatible con el polimorfismo, que es esencialmente esa comparación de tipo que está buscando, pero integrada en el lenguaje. ¿Desea ejecutar un conjunto diferente de instrucciones según el tipo? El polimorfismo le permite ejecutar una función diferente según el tipo de objeto. No necesita escribir una sola línea de código adicional, solo derivar de una base común.
usar algo como esto:
if (typeid(yourVariable)==typeid(YourClass)) //...
Alek
o dynamic_cast <> si desea probar la cadena de herencia;) –
pero solo si su tipo tiene métodos virtuales. –
dynamic_cast se utiliza en punteros polimórficos, por supuesto. No lo mencioné Tienes razón. Gracias por señalarlo;) –
dados los tipos se conocen de forma estática se puede comprobar que son los mismos de forma estática sin necesidad de utilizar rtti mediante el uso de especialización de plantilla. p.ej. usar algo como http://www.boost.org/doc/libs/1_40_0/libs/type_traits/doc/html/boost_typetraits/reference/is_same.html impulso o si no se dispone de su propio rollo
Comprobar si dos tipos son la misma se pueden lograr así (sin RTTI, el valor se puede utilizar en tiempo de compilación):
template <class T, class U>
struct same_type
{
static const bool value = false;
};
//specialization for types that are the same
template <class T>
struct same_type<T, T>
{
static const bool value = true;
};
//sample usage:
template <class FirstContainer, class SecondContainer>
bool containers_of_same_type(const FirstContainer&, const SecondContainer&)
{
return same_type<
typename FirstContainer::value_type,
typename SecondContainer::value_type
>::value;
}
#include <vector>
#include <list>
#include <iostream>
int main()
{
std::cout << containers_of_same_type(std::vector<int>(), std::list<int>());
std::cout << containers_of_same_type(std::vector<char>(), std::list<int>());
}
(Esto es básicamente cómo funciona boost::is_same
, menos las soluciones provisionales para ciertos compiladores).
wow, eso es muy inteligente –
- 1. Examinar el siguiente elemento en el contenedor STL
- 2. C contenedor STL ++ y la construcción en el lugar
- 3. Obtener tipo de contenedor a partir de (su) Tipo de iterador en C++ (STL)
- 4. ¿Cómo medir el consumo total de memoria del contenedor STL?
- 5. Elemento ignora el acolchado del elemento contenedor
- 6. Adquirir la referencia a un elemento de un contenedor STL en un ciclo 'for' basado en el rango C++ 11
- 7. Valores devueltos de la función contenedor STL
- 8. ¿Cómo envolver la matriz dinámica en el contenedor STL/Boost?
- 9. std C++ destrucción elemento contenedor y el comportamiento de inserción
- 10. C# - Contenedor de referencia para el tipo de valor
- 11. ¿Cómo verificar el tipo de un objeto en C++/CLI?
- 12. Reenviar declarar un contenedor STL?
- 13. ¿es seguro asignar un contenedor STL?
- 14. una línea para comprobar si el contenedor STL está ordenado
- 15. C++ STL: ¿Qué método de iteración sobre un contenedor STL es mejor?
- 16. contenedor stl con std :: unique_ptr's boost :: ptr_container
- 17. Orden de destrucción de elementos de contenedor STL
- 18. Tipos de letra estándar para contenedor compatible con STL
- 19. ¿Cómo manejar el 'emplace_range' que falta en C++ 0x STL?
- 20. ¿Está bien lanzar un contenedor STL con tipo Base al tipo Derivado?
- 21. Depuración de contenedores C++ STL en Windbg
- 22. Mostrar el contenido de un contenedor vectorial en C++
- 23. ¿Cómo verificar el tipo de variable? Python
- 24. Algoritmos STL tomando el contenedor completo en lugar de .begin(), end() como arg?
- 25. ¿hay algún tipo de estado triple en C++ stl?
- 26. Divida el contenedor en trozos, C++
- 27. ¿Es posible obtener el tipo de contenedor en AutoFac
- 28. ¿Cuál es el enfoque correcto al usar el contenedor STL para el cálculo mediano?
- 29. STL MAP debería usar el identificador find() o [n] para encontrar el elemento en el mapa?
- 30. C# - Obtenga el tipo de elemento para una lista genérica
¿Qué intenta hacer exactamente aquí? Como C++ está tipado estáticamente, generalmente debe saber de qué tipo son los elementos (vector, por ejemplo, contiene enteros). Si explica por qué no sabe cuáles son los tipos y para qué los quiere usar, eso ayudaría a responder la pregunta. –
@David Thornley: 'template void foo (std :: template arg) {/ * Aquí, no sabemos qué tipo de elementos es * /}' Creo que es una situación bastante común. –
jalf
@Jalf: En ese punto cierto. Pero en ese momento, foo() es solo un concepto. Pero tan pronto como uses foo() también sabrás el tipo. –