2011-08-22 15 views
9

Quiero generar un hash para una clase basada en su tipo derivado en tiempo de compilación. Hoy genero que le gusta:ID de tipo C++ en tiempo de compilación

template<class Type> 
class TypeBase 
{ 
public: 
    static const unsigned s_kID; 
}; 

template<class Type> 
const unsigned TypeBase<Type>::s_kID = hash(typeid(Type)); 

pero esto genera (bastante innecesariamente) el tiempo de ejecución de código de inicialización (la función hash (..) hace un hash simple basado en std :: :: type_info nombre())

Ideas?

+0

¿No existe el riesgo de que se produzcan colisiones hash o tal vez eso no sea un problema? –

+0

@Andreas: Al crear los hash, también tengo un mapa con las entradas de hash. Por lo tanto, puedo verificar si hay colisiones. Además de eso, el número de clases es tal vez 20, así que creo que estoy a salvo con eso también. – Robert

+0

¿No podría simplemente hacer algo como 'id = ++ someGlobalCounter'? (Me doy cuenta de que esto no es crítico para el rendimiento, solo curiosidad) –

Respuesta

3

Teniendo en cuenta todo lo demás que ocurre al iniciar el proceso, y lo simple y elegante que es su código existente, suponiendo que no hacke un montón de tipos, dejaría su solución existente exactamente como está.

+0

Gracias. Caso de optimización prematura, ¿eh? ;) – Robert

+0

De hecho. Siempre que no tenga ningún impacto en tiempo de ejecución, como los usuarios que se quejan de que la aplicación tarda 150 microsegundos demasiado en iniciarse, déjelo tal como está. Y no trates de hacer magia lanzando el puntero de esa variable a unsigned, ya que esto no va a ser portátil. – PlasmaHH

+0

@robert sí, me parece que es eso. –

Cuestiones relacionadas