2011-04-19 16 views
10

El operador typeid en C++ devuelve un objeto de la clase std::type_info que puede dar su nombre textual. Sin embargo, solo estoy interesado en obtener un identificador numérico único para cualquier clase polimórfica. (único en el ámbito de una sola ejecución del programa - no necesariamente entre las corridas)Identificador único numérico de una clase a través de typeid

En la práctica, tan sólo pudiera eliminar la referencia al puntero y leer el contenido del vptr 's - pero esto no sería ni elegante ni portátil. Prefiero una forma portátil.

¿Puedo usar el operador typeid de alguna manera para tener un identificador numérico "seguro" para una clase? Por ejemplo, ¿puedo contar con que la dirección resultante de la estructura std::type_info sea la misma para cada llamada a typeid en una clase determinada? O tal vez el puntero name() sí mismo?

+0

Se podría calcular un hash en el nombre del typeid. Como este es un literal de cadena, debería resolverse en tiempo de compilación también. Al menos eso es de lo que dice la "Gema" de donde obtuve esa idea ... mi experiencia es diferente. Para mí, la sobrecarga de esa solución es inaceptablemente alta. Pero bueno, ciertamente es portátil, así que ... sí. – Damon

+0

¿Qué problema estás tratando de resolver aquí? –

+0

El problema de mí es intentar resistir el lanzamiento de la dirección del objeto a 'void **' y quitarle la referencia para el vptr. : D Y más en serio, algo parecido a un vtable bidimensional. – Kos

Respuesta

1

Parece que type_info::hash_code() se prescribe para C++ 0x.

+9

¡Precaución! Por estándar: hash_code() no necesita devolver identificadores diferentes para dos tipos diferentes. Es un código hash no una clave. –

+0

por lo que no se garantiza que sea único – GameDeveloper

+0

-1 incorrecto. (ver a Christopher arriba) – Petter

0

miembro de datos estáticos que se inicializa con un algoritmo que utiliza un contador? Luego use MyClass :: id como el identificador único. Y luego use funciones virtuales para buscar el identificador único basado en la clase base. Garantizado para ser portátil, pero tiene una ligera carga de mantenimiento ya que necesita implementar la variable estática e implementar la función virtual para cada clase nueva que cree. Pero supongo que no es un gran problema, ya que has elegido usar C++, que se sabe que es detallado. Se vería así:

class Base { virtual int get_id() const=0; }; 
class Derived : public Base { static int id; int get_id() const { return id; } }; 
int algo() { static int count=0; count++; return count; } 
static int Derived::id = algo(); 
+2

Es posible, pero ¿no se inventó RTTI exactamente para el propósito de que no necesitaría escribir y mantener dicho código? Es el trabajo del compilador hacerlo, no el mío. – Kos

+0

Bueno, el punto es que en C++ realmente obtienes mejor código a veces si realmente haces el trabajo y escribes una cantidad ligeramente mayor de código repetitivo. – tp1

4

type_info tiene un operador ==() para comparar el tipo que describe con el tipo de otro objeto type_info. También se garantiza que los objetos sobrevivirán al programa.

Por lo tanto, si guarda las direcciones de dos type_infos, puede salirse con *p1 == *p2 para ver si se refieren al mismo tipo.

Cuestiones relacionadas