获取所有函数参数名称

时间:2012-07-13 23:12:26

标签: c++

我想要的一个例子是:

char const * bar (T1 x, T2 y) {
    return "bar";
}

char const * foo (T1 z, T2 w) {
    return bar(__PARAMS__);
}

应扩展为

char const * bar (T1 x, T2 y) {
    return "bar";
}

char const * foo (T1 z, T2 w) {
    return bar(z, w);
}

有没有办法在没有手写的情况下实现这样的远程操作?

原因:这有助于我想要实现的代码生成方案的模板元编程。它允许我从字面上复制和粘贴线条。

的(ahem!)行周围的东西
void f0 () {
    DumpCode(__PARAMS__); // DumpCode();
}

void f1 (T1 x) {
    DumpCode(__PARAMS__); // DumpCode(x);
}

void f2 (T1 x, T2 y) {
    DumpCode(__PARAMS__); // DumpCode(x, y);
}

1 个答案:

答案 0 :(得分:2)

C或C ++中没有办法以编程方式获取当前函数参数的名称或类型,也无法获取当前函数本身。他们让你得到的最接近的是__func__,它只是当前函数名称的字符串表示

因此,您必须在某处捕获参数的名称,以便您可以在参数列表中使用它们,也可以在DumpCode的参数列表中使用它们。当我们想要捕获一大块文本然后一次将其替换为两个地方时,需要

至于选择性地扩展类型,只要所有类型都是typedef',这就相当容易。如果您必须处理有选择地扩展int (*x)()x的问题,那么您将不得不重构此代码以使其变得更加丑陋。

#define PARAMS(x) x
#define ARGS(x)

#define P(TYPE) TYPE(T1) z, TYPE(T2) w
char const * foo (P(PARAMS)) {
    return bar(P(ARGS));
}
#undef P

#define P(TYPE)
void f0 (P(PARAMS)) {
    DumpCode(P(ARGS)); // DumpCode();
}
#undef P

#define P(TYPE) TYPE(T1) x
void f1 (P(PARAMS)) {
    DumpCode(P(ARGS)); // DumpCode(x);
}
#undef P

#define P(TYPE) TYPE(T1) x, TYPE(T2) y
void f2 (P(PARAMS)) {
    DumpCode(P(ARGS)); // DumpCode(x, y);
}
#undef P