我想为标题中的每个类生成唯一的数字,在我的情况下为素数,但是我们只能说是连续的数字,即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; }; };

但老实说,我不知道如何实现这一目标。

我可以实现我的目标吗?如果可以,怎么办?

最佳答案

大多数人使用__COUNTER__宏来执行此操作。但这不是标准的,整个程序只有一个。

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

10-06 10:33