可重复使用的预处理器__COUNTER__

Mic*_*Mic 4 c++ templates c-preprocessor

我正在做一些模板元编程,大多只是编写我自己的编译时间列表,但我也有一些预处理器魔法,我想用它来使事情变得更容易.

我想要做的是创建一个编译器的编译时列表.这部分已经完成,但是用于简化创建(并添加到列表)的宏则不是.

简要举例:

template<typename Functor, typename Tail>
struct node {
    typedef Functor head;
    typedef Tail tail;
};


template <typename Functor, typename Tail>
struct push_back {
    typedef node<Functor, Tail> list;
};

struct unit0 {};

#define AUTO_FUNCTION(name) struct test_functor_##name {            \
    static void run_test();                                         \
};                                                                  \
typedef push_back<                                                  \
            test_functor_##name,                                    \
            CONCAT(unit, PP_DEC(__COUNTER__))                       \
        >::list CONCAT(unit, __COUNTER__);                          \
void test_functor_##name::run_test()


AUTO_FUNCTION(hello) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

现在,这是有效的,因为我为PP_DEC创建了一大组预处理器宏,即:

#define PP_DEC(x) PP_DEC_I(x)
#define PP_DEC_I(x) PP_DEC_ ## x
#define PP_DEC_1 0
#define PP_DEC_2 1
...
#define PP_DEC_N N
Run Code Online (Sandbox Code Playgroud)

这是我真正想要避免的部分以及我提出这个问题的原因.有没有人建议如何在不增加其价值的情况下使用COUNTER,或者其他方式我可以完成类似于以下的计数模式:

 0 1
 1 2
 2 3
 ...
Run Code Online (Sandbox Code Playgroud)

改变push_back等语义的建议当然也欢迎:).

PS.这不仅仅用于制作,只是为了娱乐.因此欢迎GCC特定的扩展.

PPS.我试图避免外部依赖,例如boost,因为我想了解我正在做的一切(这个项目的重点).

Gri*_*tin 11

您可以__COUNTER__使用额外的宏"修复" 值:

#define MY_MACRO MY_MACRO_COUNTED(__COUNTER__)

#define MY_MACRO_COUNTED(counter) counter + counter
Run Code Online (Sandbox Code Playgroud)