Я не уверен, что у меня есть лучшее название для этого вопроса, не стесняйтесь улучшаться.Как передать указатели функций со стеком вызовов?
Если у меня есть
typedef void (*VoidFunction)(void);
, а затем семейство функций, которые соответствуют этому типу, я мог бы написать что-то вроде «сделки» функции-оболочки, которая выглядела что-то вроде:
void doTransaction(VoidFunction function)
{
doSomePreambleWork();
function();
doSomePostambleWork();
}
Если я имел семейство функций, которые принимали однократные аргументы, я мог бы промывать-промыть-повторить:
typedef void (*VoidOneIntFunction)(int a);
void doTransactionOneInt(VoidFunctionOneInt function, int a)
{
doSomePreambleWork();
function(a);
doSomePostambleWork();
}
Lea Винг вопрос типов возврата (IOW, предполагая, что тип возвращаемого недействительным), является возможным genericize эту модель, так что я только должен сделать написать одну функцию-обертку, что-то вроде:
// ????? 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();
}
Посмотрите на '' заголовка. Решение состоит в том, чтобы использовать список переменных аргументов. –
Will
@ Не думаю, что это то, о чем просит ОП. – 2013-04-24 17:29:06
Я надеялся на что-то более «мета», чем на эти ответы. Возможно, это невозможно с C.Я думал, что могу каким-то образом связать со стеклом, чтобы вызвать первый аргумент стека вызовов (известный как функция), а оставшаяся часть стека вызовов волшебным образом. :( –