2012-03-30 41 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; }; }; 

这是很容易出错的,因为在现实中的类并不小,如果我在中间添加一个新类我不得不改变所有的以下数字,如果我不想完全丢失ID的概述。

我希望我能做到以下几点:

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

但说实话,我不知道如何实现这一点。

我可以达到我的目标吗?如果是,如何?

+0

这与TMP有什么关系?这是你探索的途径,还是你只是希望TMP精灵会出现一个蓝色的答案? – jpm 2012-03-30 19:51:47

+0

是的,因为这不能用宏来完成,所以TMP是我最后的希望(否则如何初始化ID?)。我也会对其他可能性感到高兴。我编辑我的帖子是更一般的。 – helami 2012-03-30 19:57:59

+0

你为什么要这样? – 2012-03-30 20:12:05

回答

2

大多数人用__COUNTER__宏来做这件事。但那不是标准的,整个程序只有一个。

这是一个C++ hack我想出了使用符合标准并支持多个计数器的模板和重载。

+0

这是我选择的解决方案。 Thx明确地说出我的想法。 – helami 2012-04-01 20:38:42

0

一种方法可能是在需要唯一编号的地方对代码占位符进行硬编码,然后编写一个小型实用程序来预处理这些文件,可能会将最后使用的编号保留在文件中,以便跨越调用。