Да, это возможно:
// 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() );
}
EDIT: Как это работает? Во-первых, мы определяем размер пакета аргументов 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