Iactually ha fatto qualcosa di simile codice di un po 'di tempo fa. Quindi, cercare il seguente codice:
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);
}
Questo un breve adattamento del mio codice originale, quindi non è accuratamente testato e forse non il modo non ottimale per fare questo, ma dovrebbe funzionare almeno (almeno secondo un test rapido e dipende da cosa esattamente si vuole). Dovrebbe essere possibile farlo senza la tupla, ma non l'ho ottenuto per compilare con g ++ (non sembra che i template variadici nidificati siano necessari). Tuttavia cambiando apply
a:
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);
}
probabilmente evitare la maggior parte l'overhead introdotto dal tupla. Sarebbe ancora meglio inoltrare correttamente i risultati delle chiamate std::get
, ma sono troppo stanco per farlo scrivere ora.
pi è disponibile come M_PI in math.h. Non sei sicuro del resto, puoi pubblicare il codice con meno ellissi? –
@HansPassant Penso che OP significhi 'ith-parameter' di' pi' –
@HansPassant C++ ora è andato per tutto il tempo: non è più necessario scrivere tutto il codice! I puntini di sospensione sono in realtà codice e vengono eseguiti! –