可以用宏来抽象这个逻辑吗?

时间:2010-08-13 09:44:41

标签: c++ macros c-preprocessor

我有成千上万的函数包装器,它们实际上执行类似的逻辑:

// 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__来解决它,但我们目前使用的编译器不支持此扩展名。

任何人遇到过同样的问题和想法?

4 个答案:

答案 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中