Да, това е възможно:
// we need a compile-time helper to generate indices
template< std::size_t... Ns >
struct indices
{
typedef indices< Ns..., sizeof...( Ns ) > next;
};
template< std::size_t N >
struct make_indices
{
typedef typename make_indices< N - 1 >::type::next type;
};
template<>
struct make_indices< 0 >
{
typedef indices<> type;
};
С тези помощници се нуждаете от един препращач за вашата функция като тази:
template<typename R, typename... Args, std::size_t... Ns>
R myFunctionImpl(void *Data, void *function, indices<Ns...> ) {
auto f = (R (*)(Args...))function;
return f(read<Args>(Data, Ns + 1)...);// +1 because indices is zero-based
}
template<typename R, typename... Args>
R myFunction(void *Data, void *function) {
return myFunctionImpl< R, Args... >( Data, function, typename make_indices<sizeof...(Args)>::type() );
}
РЕДАКТИРАНЕ: Как работи? Първо определяме размера на пакета аргументи Args
чрез sizeof...
. make_indices<N>::type
след това се разширява в indices<0,1,2,...,N-1>
. Той се дава като допълнителен параметър към функцията за внедряване (от пренасочващия, който просто създава фиктивен екземпляр), следователно дедукцията на аргументи се включва от страна на функцията за изпълнение и поставя генерираните индекси в пакета аргументи Ns
.
Функцията за изпълнение вече има два пакета аргументи с еднакъв размер, а именно Args
и Ns
. Когато се разшири чрез многоточие ...
, многоточието разширява целия израз, към който е приложено, и разширява паралелно всички пакети с параметри! В горния пример този израз е read<Args>(Data, Ns+1)
, който добре се разширява в псевдокода на OP.
person
Daniel Frey
schedule
04.03.2013
void *
. Това, че функцията еvoid *
, е проблем. - person Vaughn Cato   schedule 04.03.2013void*
е UB. Ще трябва да го реша малко по-различно, но все пак мога да разреша проблема, като използвам идеи от приетия отговор. - person Juraj Blaho   schedule 05.03.2013void*
за аргументаfunction
, щях да добавя друг параметър на шаблона за типа на функцията, тогава не е необходимо преобразуването на типа. - person Some programmer dude   schedule 05.03.2013void*
данни. Ще трябва да обвия указателя на функцията вstruct
. - person Juraj Blaho   schedule 05.03.2013