10

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

但老实说,我不知道如何实现它。

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

4

4 回答 4

4

我认为 Boost 预处理器库可以为您做到这一点,也许您应该阅读:如何在 C 预处理器中生成唯一值?

根据您使用的编译器,有一个替代方案,gcc 和 msvc 有一个____COUNTER___宏,它允许序号:http ://gcc.gnu.org/onlinedocs/cpp/Common-Predefined-Macros.html#Common-Predefined -宏

于 2012-03-30T20:05:37.067 回答
3

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

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

于 2012-04-01T16:06:37.200 回答
1

如果使用gcc,可以使用__COUNTER__

于 2012-03-30T20:12:23.510 回答
0

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

于 2012-03-30T19:53:12.020 回答