可以用宏抽象这个逻辑吗?
我有数千个函数包装器,它们内部实际上执行类似的逻辑,例如:
// 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__
解决它,但我们当前使用的编译器不支持此扩展)
有人遇到过同样的问题和任何想法吗?
I have thousands of function wrappers which inside actually perform a similar logic like:
// 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, ..);
}
I want to use a macro to reuse the if-else logic so I can simply implement the function like this:
void API_Wrapper(hHandle, a, b, ..)
{
API_CALL(api_name, hHandle, a, b, ..); // API_CALL is a macro
}
I didn't come up with a good way. (Note: I could solve it via ... and __va_args__
but this extension is not supported by the compiler we currently use)
Anyone ever met the same problem and any idea?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
另一个技巧,没有可变参数宏:
变成:
Another trick, without variadic macro's:
Which becomes:
定义单独的 API_CALL0、API_CALL1 等:)
顺便说一句,您可能想研究一些能够自动化整个 API_Wrapper 的东西
define separate API_CALL0, API_CALL1 etc:)
You may wanna look into something that will automate the whole API_Wrapper thing, btw
这变成了
Which becomes
使用 BOOST_PP_SEQ_XXXX 你可以用类似于这样的方式编写包装器表:
如果没有可变参数宏,你可以使用空格分隔的列表,该列表被视为单个宏参数+一些封装在 boost pp 中的预处理器技术
Using BOOST_PP_SEQ_XXXX you can write your wrapper table in a way similar to this:
without variadic macros you can use space separated list which is treated as single macro parameter + some preprocessor techics incapsulated in boost pp