Генерация уникальных чисел во время компиляции - PullRequest
8 голосов
/ 30 марта 2012

Я хочу генерировать уникальные числа для каждого класса в моем заголовке, простые числа в моем случае простые, но, скажем, это должны быть только последовательные числа, т.е. 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 не могут иметь побочных эффектов, это невозможно,Я думаю, что с использованием макросов такой результат тоже невозможен.

Мне бы тоже повезло с чем-то вроде этого:

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

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

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

Ответы [ 4 ]

4 голосов
/ 31 марта 2012

Я думаю, что библиотека препроцессора Boost может сделать это за вас, может быть, вы должны прочитать это: Как я могу генерировать уникальные значения в препроцессоре C?

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

3 голосов
/ 01 апреля 2012

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

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

1 голос
/ 31 марта 2012

Если вы используете gcc, вы можете использовать макрос __COUNTER__ .

0 голосов
/ 30 марта 2012

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

...