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)
| 归档时间: |
|
| 查看次数: |
3631 次 |
| 最近记录: |