Я пишу адаптер для объединения двух API (один на C, а другой на C++). Если функция вызывается в одном API, мне нужно передать идентификатор вызывающего абонента и аргументы функции адаптеру и вызвать соответствующую функцию с этой переданной информацией.
Теперь, по-видимому, они не могут быть сопоставлены напрямую, так как один интерфейс требует компиляции C++, а изменение имени испортит другой, поэтому я в первую очередь использую набор адаптеров.
Поскольку количество аргументов варьируется, я искал вариативные функции и нашел эту идею довольно полезной, однако я работаю только с POD и должен иметь дело со структурами, перечислениями и множеством различных аргументов для каждого вызова, которые, возможно, придется вернуть. в структуру перед передачей ее целевой функции.
Каждый пример, на который я наткнулся, был намного проще и включал в себя в основном арифметические операции, такие как суммирование, поиск наибольших чисел или печать. В основном это делается с помощью циклов for в var_list.
Может быть, я застрял на идее, и это вообще не сработает, но мне просто интересно...
Скажем, я хотел присвоить аргументы из списка параметрам моих целевых функций (порядок переданных аргументов правильный), что было бы хорошим способом?
BOOL Some_Function(
/* in */ CallerId *pObjectId,
/* in */ someDataType argument1 )
{
BOOL ret = Adapter_Call(pFunction, pObjectId, argument1);
return ret;
}
и так раз я добрался до нужного адаптера хочу сделать
BOOL Adapter_Call(*pFunction, *pObjectId, argument1, ...)
{
va_list args;
va_start(args, argument1);
/*go over list and do `var_list[i] = pFunctionArgList[i]` which is
of whatever type so I can use it as input for my function */
va_end(args);
pObjectId.pFunction(arg1,...,argn);
}
Могу ли я получить доступ к входным параметрам функции для выполнения подобных назначений? Кто-нибудь делал что-то подобное раньше? Есть ли концептуальная ошибка в моем мышлении?
Все, что я нашел в сети, это http://www.drdobbs.com/cpp/extracting-function-parameter-and-return/240000586but из-за использования шаблонов я не уверен, что это не создаст еще одну проблему, поэтому, в конце концов, реализация адаптера для каждого и каждый вызов функции может быть проще сделать.
Поиск SO вернул только это: Динамические вызовы функций во время выполнения (va_list)
extern "C"
в C++ для получения имен C? - person Kerrek SB   schedule 23.08.2013va_list
. Эти функции можно тривиально вызывать из оболочки C++. Например, стандартная библиотека предоставляетprintf
(varadic) иvprintf
(используяva_list
). - person Lindydancer   schedule 23.08.2013