2012-03-30 3 views
7

Я хочу генерировать уникальные числа для каждого класса в моем заголовке, простые в моем случае простые числа, но предположим, что это должны быть только последовательные числа, то есть 1,2,3,4 и т. Д.Генерировать уникальные числа во время компиляции

Конечно, я могу жёстко это:

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

Это очень подвержены ошибкам, так как в действительности классы не так мало, и если я добавить новый класс в середине я должен изменить все следующие если я не хочу полностью потерять обзор идентификаторов.

Я хотел бы сделать следующее:

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

Но поскольку constexpr функции вызовы не могут иметь побочные эффекты, AFAIK, это невозможно. Я думаю, что использование макросов такого результата тоже невозможно.

Я бы также повезло с чем-то вроде этого:

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

Но если честно, я понятия не имею, как это осуществить.

Могу ли я достичь своей цели, и если да, то как?

+0

Что это связано с TMP? Это проспект, который вы изучили, или вы просто надеетесь, что мастер TMP придет вместе с ответом из-за синего? – jpm

+0

Да, поскольку это невозможно сделать с помощью макросов, TMP - моя последняя надежда (или как инициализировать идентификатор в противном случае?). Я также был бы рад другим возможностям. Я редактировал свой пост, чтобы быть более общим. – helami

+0

Зачем вам это нужно? –

ответ

2

Большинство людей делают это с помощью макроса __COUNTER__. Но это нестандартно, и есть только одна для всей программы.

Вот C++ hack Я придумал использование шаблонов и перегрузку, которая соответствует стандарту и поддерживает несколько счетчиков.

+0

Это решение, которое я выбрал. Thx для явного высказывания того, что я думал. – helami

0

Один из способов может заключаться в том, чтобы жестко закодировать местозаполнитель везде, где вы хотите уникальный номер, а затем написать небольшую утилиту для предварительной обработки файлов, возможно, сохраняя последний использованный номер в файле, чтобы он сохранялся во всех окнах ,

4

Я думаю, что библиотека подталкивания препроцессор может сделать это для вас, может быть, вы должны прочитать, что: How can I generate unique values in the C preprocessor?

Существует альтернатива в зависимости от компилятора, который вы используете, GCC и MSVC есть ___COUNTER___ макрос позволяет порядковый номер: http://gcc.gnu.org/onlinedocs/cpp/Common-Predefined-Macros.html#Common-Predefined-Macros

 Смежные вопросы

  • Нет связанных вопросов^_^