【发布时间】:2012-04-14 12:37:01
【问题描述】:
我想为我的标题中的每个类生成唯一的数字,在我的情况下为素数,但假设这应该只是连续的数字,即 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 函数调用不能产生副作用 afaik,这是不可能的。我认为使用宏也是不可能的。
如果遇到这样的事情,我也会很幸运:
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; }; };
但老实说,我不知道如何实现。
我可以实现我的目标吗?如果可以,如何实现?
【问题讨论】:
-
这与 TMP 有什么关系?这是您探索过的途径,还是只是希望 TMP 向导会突然给出答案?
-
是的,因为这不能用宏来完成,所以 TMP 是我最后的希望(或者如何初始化 ID?)。我也会对其他可能性感到高兴。我编辑了我的帖子,使其更笼统。
标签: c++ c++11 metaprogramming compile-time side-effects