Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在编译时生成唯一的数字_C++_C++11_Metaprogramming_Compile Time_Side Effects - Fatal编程技术网

C++ 在编译时生成唯一的数字

C++ 在编译时生成唯一的数字,c++,c++11,metaprogramming,compile-time,side-effects,C++,C++11,Metaprogramming,Compile Time,Side Effects,我想为我的标题中的每个类生成唯一的数字,在我的例子中是primes,但假设这应该是连续的数字,即1,2,3,4,等等 当然,我可以硬编码这些: struct A { enum { ID = 1; }; }; struct B { enum { ID = 2; }; }; struct C { enum { ID = 3; }; }; struct D { enum { ID = 4; }; }; 这是非常容易出错的,因为在实际中,类不是很小,如果我在中间添加一个新类,如果我不想完全放松IDS的

我想为我的标题中的每个类生成唯一的数字,在我的例子中是primes,但假设这应该是连续的数字,即1,2,3,4,等等

当然,我可以硬编码这些:

struct A { enum { ID = 1; }; };
struct B { enum { ID = 2; }; };
struct C { enum { ID = 3; }; };
struct D { enum { ID = 4; }; };
<>这是非常容易出错的,因为在实际中,类不是很小,如果我在中间添加一个新类,如果我不想完全放松IDS的概览,我必须改变所有的下面的数字。 我希望我能做到以下几点:

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; }; };
但老实说,我不知道如何实现这一点


我可以实现我的目标吗?如果可以,如何实现?

一种方法可能是在需要唯一数字的地方硬编码占位符,然后编写一个小实用程序来预处理文件,也许可以将最后使用的数字保留在文件中,以便在调用过程中保持不变。

我认为Boost预处理器库可以为您做到这一点,也许你应该读一下:


根据您使用的编译器的不同,还有一种替代方法,gcc和msvc有一个允许序列号的\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu宏:

如果您使用
gcc
,您可以使用。

大多数人使用
宏来实现这一点。但这是不标准的,整个项目只有一个


下面是我提出的一个使用模板和重载的方法,它符合标准并支持多个计数器。

这与TMP有什么关系?这是您已经探索过的一条途径,还是您只是希望TMP向导会突然出现一个答案?是的,因为这不能用宏来完成,所以TMP是我最后的希望(或者如何初始化ID?)。我也很高兴有其他的可能性。我编辑我的文章是为了更一般。可能是重复,或者回答:对于C: