在编译时生成唯一的数字

时间:2012-03-30 19:46:57

标签: c++ c++11 metaprogramming compile-time side-effects

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

答案 0 :(得分:4)

我认为Boost预处理器库可以为您做到这一点,也许您应该阅读:How can I generate unique values in the C preprocessor?

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

答案 1 :(得分:3)

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

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

答案 2 :(得分:1)

如果您使用gcc,则可以使用the __COUNTER__ macro

答案 3 :(得分:0)

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