2011-08-22 15 views
9

Voglio generare un hash per una classe basata sul suo tipo derivato in fase di compilazione. Oggi ho generare le cose come:ID tipo C++ al momento della compilazione

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

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

ma questo genera (abbastanza inutilmente) tempo di esecuzione codice di inizializzazione (la funzione di hash (..) fa un hash semplice sulla base di std :: :: type_info nome())

Idee?

+0

Non c'è il rischio che si ottengano collisioni da hash o forse non è un problema? –

+0

@Andreas: quando creo gli hash, ho anche una mappa con le voci di hash. Quindi posso controllare se ci sono collisioni. Oltre a questo, il numero di classi è forse di 20, quindi credo di essere al sicuro anche con quello. – Robert

+0

Non potresti semplicemente fare qualcosa come 'id = ++ someGlobalCounter'? (Mi rendo conto che questo non è un aspetto critico, solo curioso) –

risposta

3

Dato tutto ciò che accade all'avvio del processo e quanto semplice ed elegante sia il codice esistente, supponendo che non si disponga di un tipo di gazillion, lascerei la soluzione esistente esattamente così com'è.

+0

Grazie. Caso di ottimizzazione prematura, eh? ;) – Robert

+0

Infatti. Finché non si ha alcun impatto sul runtime come gli utenti che si lamentano del fatto che l'applicazione impiega 150 microsecondi per l'avvio, lasciare così com'è. E non provare a fare alcuna magia di lanciare il puntatore di quella variabile su unsigned, in quanto questo non sarà portatile. – PlasmaHH

+0

@robert si, sembrerebbe che io sia quello. –

Problemi correlati