2012-07-13 109 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