Ver Mensaje Individual
  #5 (permalink)  
Antiguo 19/10/2009, 04:32
Avatar de r0d
r0d
 
Fecha de Ingreso: noviembre-2007
Mensajes: 86
Antigüedad: 17 años, 1 mes
Puntos: 3
Respuesta: averiguar de que tipo es "X" ( char, int,..? )

El c++ (supongo que hablamos de c++ porque veo que usas template y tal) tiene un problema con la "reflexion" (no sé como se dice en español), cosa que hacen muy bien lenguaje como C# y java. La razon es por ganar (o no perder) en rapidez de ejecution: en c++, la zona de memoria alocada no tiene el tipo del objeto almacenado.

Entonces, no hay niguna manera "nativa" de hacer esto, hay que hacer trampa, y todas son peligrosas.

La verdad es que, "normalmente", esta situacion deberia occurir nunca. Deberia... en teoria, pero en la "vida real", ocurre mucho. Ocurre mucho porque el paradigma objeto es dificil, pero cuando occure esto, 99% de las veces, es un error de diseño.

La mejor manera de hacer es un poco complicada. Consiste en usar el paradigma traits. Me explico:

Tenemos el codigo siguiente:
Código:
template<typename T>
void f( const std::list<T> & miLista )
{
// segun el tipo de T, voy a hacer algo distinto
// aqui se vee muy bien el error de diseño: el principio y la razon de ser de une argumento template es de manegar la lista si preocuparse del tipo de los elementos)
}
Pero bueno, hay veces que puede ser una buena cosa. En este caso, hay que usar un trait:
Código:
#include <iostream>
#include <list>
using namespace std;

template <typename T>
struct IsChar  // eso es el trait
{
	static const bool value = false;
};

template <>
struct IsChar <char> // especialisacion de template
{
	static const bool value = true;
};

template<typename T>
void f( const list<T> & myList )
{
	if ( IsChar<T>::value == true )
		cout << "is char" << endl;
	else
		cout << "is not char" << endl;
}

int main()
{
	list<int> intList;
	list<char> charList;
	f( intList );
	f( charList );

	cout << "end" << endl;
	cin.get();
	return 0;
}
Es la unica buena manera de hacer, pero claro que es un poco complicado. Para entender lo que hace este codigo, tienes que compilarlo en modo debug y seguir paso a paso.

Sino, existen trampas horribles (por ejemplo usando RTTI y reinterpret_cast<>) pero prefiero no hablar de esto... solo pensar en esto me disgusta ya...
__________________
Alicia: Sólo quiero saber que camino debo tomar.
Gato risón: Pues... depende mucho de donde quieras ir.

Mi página web