我想用D / s mixins和C / C ++预处理器做同样的事情。我想编写一个函数来生成参数列表。例如:
#define MK_FN_FOO(n,t) …
MK_FN_FOO(3,float)
/* it will expand into */
void foo(float x0, float x1, float x2) {
/* do something else here */
}
我有一些想法,但我遇到了一个问题。我必须做递归,我不知道如何做这样的事情:
#define MK_FOO(n,t) void foo(MK_FOO_PLIST(n-1,t)) { }
#define MK_FOO_PLIST(n,t) t xn, MK_FOO_PLIST(n-1,t) /* how stop that?! */
答案 0 :(得分:4)
boost库有大量的元编程和其他所有预处理器库。使用它们的实用程序预处理程序指令可以做这种事情,这比使用它自己要容易得多,尽管仍然有点混乱:)
我建议你从那里开始:
http://www.boost.org/doc/libs/1_53_0/libs/preprocessor/doc/index.html
http://www.boost.org/doc/libs/?view=category_Preprocessor
编辑:这是另一个关于它们的教程: Boost.Preprocessor - Tutorial
答案 1 :(得分:0)
我已经检查了/boost/preprocessor/repetition/repeat.hpp
中的提升实现,对于你的例子,它可以归结为类似的东西:
#define MK_FN_FOO_REPEAT_0(t)
#define MK_FN_FOO_REPEAT_1(t) MK_FN_FOO_REPEAT_0(t) t x0
#define MK_FN_FOO_REPEAT_2(t) MK_FN_FOO_REPEAT_1(t), t x1
#define MK_FN_FOO_REPEAT_3(t) MK_FN_FOO_REPEAT_2(t), t x2
#define MK_FN_FOO_REPEAT_4(t) MK_FN_FOO_REPEAT_3(t), t x3
// etc... boost does this up to 256
#define MK_FN_FOO(n, t) void foo(MK_FN_FOO_REPEAT_ ## n(t))
MK_FN_FOO(3, float) // will generate: void foo(float x0, float x1, float x2)
{
}