【发布时间】:2013-04-24 17:25:28
【问题描述】:
我不确定我是否有这个问题的最佳标题,请随时改进。
如果我有
typedef void (*VoidFunction)(void);
然后是适合这种类型的一系列函数,我可以编写一种“事务”包装函数,如下所示:
void doTransaction(VoidFunction function)
{
doSomePreambleWork();
function();
doSomePostambleWork();
}
如果我有一系列接受单个 int 参数的函数,我可以清洗-冲洗-重复:
typedef void (*VoidOneIntFunction)(int a);
void doTransactionOneInt(VoidFunctionOneInt function, int a)
{
doSomePreambleWork();
function(a);
doSomePostambleWork();
}
离开返回类型的问题(iow,假设返回类型为 void),是否可以泛化这种模式,这样我只需要编写一个包装函数,例如:
// ????? I'm not sure how i'd type the passed function
void doTransactionGeneric(void * function, ...)
{
doSomePreambleWork();
function(); // ????? and i don't know how i'd go about calling it...
doSomePostambleWork();
}
【问题讨论】:
-
看看
<stdarg.h>标头。解决方案是使用可变参数列表。 -
@Will 我认为这不是 OP 所要求的。
-
我希望得到比这些答案更“元”的东西。也许用 C 是不可能的。我想我可以以某种方式弄乱堆栈,以某种方式神奇地调用调用堆栈的第一个参数(已知是一个函数)和调用堆栈的其余部分。 :(
标签: c