Pracuję ostatnio z libffi, a ponieważ używa API C, wszelkie abstrakcje są wykonywane za pomocą wskaźników void (good ol 'C). Tworzę klasę (z szablonami variadic), która wykorzystuje ten interfejs API. Deklaracja klasy jest następujący: (gdzie Ret
= wartość zwrotna i Args
argumenty = function)Wariacyjne szablony: iteracja na argumencie typu/szablonu
template <typename Ret, typename... Args>
class Function
W tej klasie mam dwie różne funkcje zadeklarowane jako dobrze (uproszczony):
Ret Call(Args... args); // Calls the wrapped function
void CallbackBind(Ret * ret, void * args[]); // The libffi callback function (it's actually static...)
chcę aby móc używać Call
z CallbackBind
; i to jest mój problem. Nie mam pojęcia, w jaki sposób mam przekonwertować tablicę void*
na listę szablonów argumentów. To jest to, co chcę bardziej lub mniej:
CallbackBind(Ret * ret, void * args[])
{
// I want to somehow expand the array of void pointers and convert each
// one of them to the corresponding template type/argument. The length
// of the 'void*' vector equals sizeof...(Args) (variadic template argument count)
// Cast each of one of the pointers to their original type
*ret = Call(*((typeof(Args[0])*) args[0]), *((typeof(Args[1])*) args[1]), ... /* and so on */);
}
Jeśli nie jest to osiągalne, czy są jakieś obejścia lub różne rozwiązania dostępne?
Czy istnieje powód, dla którego nie można po prostu wywoływać wywołania zwrotnego bezpośrednio w interfejsie API biblioteki? Masz już 'void *' i już tego oczekuje. –
Mmm dlaczego chcesz wywołać funkcję szablonu variadic ze stałą ilością argumentów? W oparciu o fakt, że "długość argumentów jest równa sizeof ... (Args)", to znasz liczbę wymaganych argumentów, po co używać szablonów variadic ?. – mfontanini
@MarkB Ponieważ 'CallbackBind' nazywa się _from_ API biblioteki, staram się wywoływać moją własną funkcję, która nie używa wskaźników void. @mfontanini Chcę klasę, która naśladuje 'std :: function', a więc wymagam szablonów wariatów (takich jak' operator() (Args ...) ') –