2012-03-30 20 views
7

Voglio generare numeri univoci per ogni classe nella mia intestazione, primi nel mio caso numeri primi ma diciamo che questo dovrebbe essere solo numeri consecutivi, ad esempio 1,2,3,4, ecc.Genera numeri univoci al momento della compilazione

Certo che posso hardcode questi:

struct A { enum { ID = 1; }; }; 
struct B { enum { ID = 2; }; }; 
struct C { enum { ID = 3; }; }; 
struct D { enum { ID = 4; }; }; 

Questo è molto soggetto ad errori in quanto, in realtà, le classi non sono così piccoli e se posso aggiungere una nuova classe nel mezzo devo cambiare tutti i seguenti numeri se non voglio perdere completamente la panoramica degli ID.

Vorrei poter effettuare le seguenti operazioni:

struct A { enum { ID = get_next_int(); }; }; 
struct B { enum { ID = get_next_int(); }; }; 
struct C { enum { ID = get_next_int(); }; }; 
struct D { enum { ID = get_next_int(); }; }; 

Ma dal momento che le funzioni constexpr chiamate non possono avere effetti collaterali per quanto ne so, questo è impossibile. Penso che l'utilizzo di macro come questo sia impossibile.

Vorrei anche essere fortunati con qualcosa di simile:

struct A_id_holder : some_base_counter {}; 
struct A { enum { ID = A_id_holder::ID; }; }; 

struct B_id_holder : some_base_counter {}; 
struct B { enum { ID = B_id_holder::ID; }; }; 

struct C_id_holder : some_base_counter {}; 
struct C { enum { ID = C_id_holder::ID; }; }; 

struct D_id_holder : some_base_counter {}; 
struct D { enum { ID = D_id_holder::ID; }; }; 

Ma onestamente, non ho idea di come implementare questo.

Posso raggiungere il mio obiettivo e se sì, come?

+0

Che cosa ha a che fare questo con TMP? È una strada che hai esplorato, o speri solo che un mago del TMP abbia una risposta inaspettata? – jpm

+0

Sì, poiché questo non può essere fatto con macro, TMP è la mia ultima speranza (o come inizializzare un ID altrimenti?). Sarei anche contento di altre possibilità. Ho modificato il mio post per essere più generale. – helami

+0

Perché vuoi questo? –

risposta

2

La maggior parte delle persone lo fa con la macro __COUNTER__. Ma non è standard e ce n'è solo uno per l'intero programma.

Ecco un C++ hack Mi è venuta in mente l'utilizzo di modelli e sovraccarico che è conforme agli standard e supporta più contatori.

+0

Questa è la soluzione che ho scelto. Grazie per aver detto esplicitamente quello che pensavo. – helami

0

Un modo potrebbe essere quello di codificare in modo temporaneo un segnaposto ovunque si desideri un numero univoco e quindi scrivere una piccola utilità per pre-elaborare i file, magari mantenendo l'ultimo numero utilizzato in un file in modo che rimanga invariato .

Problemi correlati