Как-то давно что-то подобное сработало. Так что попробуйте следующий код:
template<unsigned N, unsigned M>
struct call_up_impl{
template<class Func, class Mutator, class Tuple, class... Args>
static void do_call(const Func& func, const Mutator& mutator, const Tuple& args, Args&&... unpacked_args) {
call_up_impl<N-1, M>::do_call(func, mutator, args, std::get<N-1>(args), std::forward<Args>(unpacked_args)...);
}
};
template<unsigned M>
struct call_up_impl<0, M> {
template<class Func, class Mutator, class Tuple, class... Args>
static void do_call(const Func& func, const Mutator&, const Tuple&, Args&&... unpacked_args) {
func(std::forward<Args>(unpacked_args)...);
}
};
template<unsigned M>
struct call_up_impl<M, M> {
template<class Func, class Mutator, class Tuple, class... Args>
static void do_call(const Func& func, const Mutator& mutator, const Tuple& args, Args&&... unpacked_args) {
call_up_impl<M-1, M>::do_call(func, mutator, args, mutator(std::get<M-1>(args)), std::forward<Args>(unpacked_args)...);
}
};
template<int i, typename Function, typename... Parms>
void apply(Function f, Parms... parms) {
std::tuple<Parms...> t(parms...);
call_up_impl<std::tuple_size<decltype(t)>::value, i + 1>::do_call(f, &g, t);
}
Это быстрый адаптация моего оригинального кода, так что это не полностью проверен и, возможно, не в не оптимальный способ сделать это, но он должен работать, по крайней мере (по крайней мере, в соответствии с быстрым тестом и в зависимости от того, что именно вы хотите). Это должно быть возможно сделать без кортежа, но я не получил этого для компиляции с g ++ (ему не нравятся вложенные вариационные шаблоны). Однако изменение apply
к:
template<int i, typename Function, typename... Parms>
void apply(Function f, Parms&&... parms) {
std::tuple<Parms&&...> t(std::forward<Parms>(parms)...);
call_up_impl<std::tuple_size<decltype(t)>::value, i + 1>::do_call(f, &g, t);
}
вероятно избежать большей части накладных расходов, вносимой кортежа. Было бы еще лучше сделать правильную пересылку результатов вызовов std::get
, но я слишком устал, чтобы работать над этим сейчас.
pi доступен как M_PI в math.h. Не уверен относительно остальных, можете ли вы опубликовать код с меньшим количеством многоточия? –
@HansPassant Я думаю, что OP означает 'ith-parameter' by' pi' –
@HansPassant C++ теперь прошел весь путь: вам больше не нужно писать весь код! Эллипсис на самом деле является кодом и выполняется! –