我有成千上万的函数包装器,它们实际上执行类似的逻辑:
// 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 :(得分:1)
另一个技巧,没有可变参数宏:
#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);;
}
答案 1 :(得分:0)
定义单独的API_CALL0,API_CALL1等:) 你可能想要研究能够自动化整个API_Wrapper事物的东西,顺便说一句
答案 2 :(得分: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);;
}
答案 3 :(得分: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) ) ....
没有可变参数宏你可以使用空格分隔列表,它被视为单个宏参数+一些预处理器技术包含在boost pp中