C++ 在编译时生成唯一的数字
我想为我的标题中的每个类生成唯一的数字,在我的例子中是primes,但假设这应该是连续的数字,即1,2,3,4,等等 当然,我可以硬编码这些: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的
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: