2010-08-13 23 views
3

我有成千上萬的功能包裝的其內部竟如同執行類似的邏輯:可能用宏抽象這個邏輯嗎?

// a, b, ... are variable length parameters of different type 

void API_Wrapper(hHandle, a, b, ..) 
{ 
if (hHandle) 
    return remote_API(hHandle, a, b, ..); 
else 
    return API(a, b, ..); 
} 

我想用宏重用的if-else邏輯,所以我可以簡單地實現這樣的功能:

void API_Wrapper(hHandle, a, b, ..) 
{ 
    API_CALL(api_name, hHandle, a, b, ..); // API_CALL is a macro 
} 

我沒有想出一個好方法。 (注意:我可以通過...和__va_args__解決,但是我們目前使用的編譯器不支持此擴展)

任何人都遇到過同樣的問題和任何想法?

+0

你正在使用哪種編譯器? – kennytm 2010-08-13 09:47:47

+0

你可以做你的包裝的兩個示例實例,所以我們可以看到它是如何「泛化」? – GManNickG 2010-08-13 09:48:19

+0

你使用可變參數嗎? – Sjoerd 2010-08-13 09:58:22

回答

1

另一個竅門incapsulated一些預處理techics,沒有可變參數宏的:

#define API_CALL(hHandle, api_name, arguments) if (hHandle) return remote_##api_name arguments; else return api_name arguments; 

void API_Wrapper(int hHandle, int a, double b, char c) 
{ 
      API_CALL(hHandle, api_name, (a, b, c)); 
} 

其中就變成了:

void API_Wrapper(int hHandle, int a, double b, char c) 
{ 
    if (hHandle) return remote_api_name (a, b, c); else return api_name (a, b, c);; 
} 
0

定義單獨API_CALL0,API_CALL1等:) 你可能想看看的東西,將自動完成整個API_Wrapper東西,順便說一句

0
#define API_CALL(api_name, hHandle, ...) if (hHandle) remote##api_name(hHandle, __VA_ARGS__); else api_name(hHandle, __VA_ARGS__); 

void API_Wrapper(int hHandle, int a, double b, char c) 
{ 
      API_CALL(api_name, hHandle, a, b, c); 
} 

,這已經成爲

void API_Wrapper(int hHandle, int a, double b, char c) 
{ 
    if (hHandle) remoteapi_name(hHandle, a, b, c); else api_name(hHandle, a, b, c);; 
} 
+0

謝謝。問題是__VA_ARGS__現在不是可移植的,我們的編譯器不支持它(msvc7.1,gcc3.4)。 – 2010-08-13 10:06:29

+0

看起來像一個預處理器的東西 – user376258 2010-08-13 10:17:56

0

使用BOOST_PP_SEQ_XXXX你可以寫你的包裝表類似於此:

 
WRAP_API(myfunc1, param(int, k) param(double, r) param(char*, s)) 
          ^   ^
           ^blank   ^blank 

WRAP_API(myfunc2, param(int, k)) 

.... 

沒有複雜的宏,你可以使用空格分隔列表,它被視爲單個宏參數+升壓PP