Пиша адаптер за комбиниране на два API (един в C и друг в C++). Ако дадена функция се извика на един API, трябва да предам идентификатора на обаждащия се и аргументите на функцията към адаптер и да извикам съответната функция с тази предадена информация.
Сега очевидно те не могат да бъдат картографирани директно, тъй като единият интерфейс изисква компилация на C++ и изкривяването на името би прецакало другия, така че на първо място използвам набор от адаптери.
Тъй като броят на аргументите варира, потърсих различни функции и намерих идеята за доста полезна, но аз работя само с POD и трябва да се справям със структури, enum и много различни аргументи на повикване, които може да се наложи да бъдат върнати обратно в структура, преди да я подадете към целевата функция.
Всеки случай, на който се натъкнах, беше далеч по-прост и включваше предимно аритметични операции като сумиране на неща, намиране на най-големи числа или отпечатване. Най-често се прави с 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
(варадик) иvprintf
(с помощта наva_list
). - person Lindydancer   schedule 23.08.2013