可重复使用的预处理器__COUNTER__

时间:2011-01-18 01:04:39

标签: 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) {
    ...
}

现在,这是有效的,因为我为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

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

 0 1
 1 2
 2 3
 ...

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

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

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

1 个答案:

答案 0 :(得分:11)

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

#define MY_MACRO MY_MACRO_COUNTED(__COUNTER__)

#define MY_MACRO_COUNTED(counter) counter + counter