2012-07-13 131 views
1

什么,我要的就是这样的一个例子:获取所有功能参数名称

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); 
} 

有什么办法来实现任何远程这样没有手写呢?

原因:这将有助于我想要实现的代码生成方案的模板元编程。这将允许我从字面上复制和粘贴这些行。周围的东西在(啊哈!)线的

void f0() { 
    DumpCode(__PARAMS__); // DumpCode(); 
} 

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

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

是:写'foo(x,y,recurse)'。你用它做什么?如果我看过一个,这是一个XY问题。 – 2012-07-13 23:15:10

+0

我认为你只是要咬下子弹并多打一点;这是不可能的AFAIK(BIDKVF)。 – 2012-07-13 23:22:17

+0

除了调用'DumpCode'外,函数的主体是否都一样? – 2012-07-13 23:23:11

回答

2

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

所以你将不得不在某处捕获参数的名字,以便你可以在参数列表和参数列表中使用它们到DumpCode。当我们想要捕获一段文本,然后将其替换为两个地方时,需要一个

至于选择性地扩展类型,只要所有类型都是typedef'ed,就相当容易。如果你必须处理选择性的扩展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