2012-03-30 14 views
7

Quiero generar números únicos para cada clase en mi encabezado, los primos en mi caso primos pero digamos que esto debería ser solo números consecutivos, es decir, 1,2,3,4, etc.Generar números únicos en tiempo de compilación

Por supuesto que puedo codificar los siguientes:

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

Esto es muy propenso a errores, ya que en realidad las clases no son tan pequeños y si añado una nueva clase en el medio tengo que cambiar todo el siguiente números si no quiero perder completamente la visión general de los ID.

me gustaría poder hacer lo siguiente:

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(); }; }; 

Pero puesto que las funciones constexpr llamadas no pueden tener efectos secundarios que yo sepa, esto es imposible. Creo que usar macros como resultado es imposible también.

Me gustaría también tener suerte con algo así:

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; }; }; 

Pero honestamente, no tengo idea de cómo poner en práctica eso.

¿Se puede lograr mi objetivo y, en caso afirmativo, cómo?

+0

¿Qué tiene esto que ver con TMP? ¿Es esa una avenida que has explorado, o solo esperas que un asistente de TMP venga con una respuesta de la nada? – jpm

+0

Sí, dado que esto no se puede hacer con macros, TMP es mi última esperanza (¿o cómo inicializar una ID de lo contrario?). También me alegrarían otras posibilidades. Edité mi publicación para ser más general. – helami

+0

¿Por qué quieres esto? –

Respuesta

2

La mayoría de las personas hace esto con la macro __COUNTER__. Pero eso no es estándar, y solo hay uno para todo el programa.

Aquí está un C++ hack Se me ocurrió usar plantillas y sobrecarga que es estándar-compatible y admite múltiples contadores.

+0

Esta es la solución que elegí. Thx por decir explícitamente lo que pensaba. – helami

0

Una forma puede ser codificar un marcador de posición donde desee un número único, y luego escribir una pequeña utilidad para preprocesar los archivos, quizás manteniendo el último número utilizado en un archivo para que persista en todas las invocaciones .

Cuestiones relacionadas