De fait, j'ai codé quelque chose de similaire il y a quelque temps. Donc, essayez le code suivant:
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);
}
Ceci est une adaptation rapide de mon code d'origine, il est donc pas testé à fond et peut-être pas la façon pas optimale pour ce faire, mais il devrait fonctionner au moins (au moins selon un test rapide et en fonction de ce que vous voulez exactement). Il devrait être possible de le faire sans le tuple, mais je n'ai pas réussi à le compiler avec g ++ (il ne semble pas aimer les templates variés imbriqués). Cependant le changement 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);
}
probablement éviter la plupart des frais généraux introduite par le tuple. Il serait encore mieux de faire un renvoi correct des résultats des appels std::get
, mais je suis trop fatigué pour travailler sur cette écriture maintenant.
pi est disponible en tant que M_PI en math.h. Pas sûr du reste, pouvez-vous poster du code avec moins de points de suspension? –
@HansPassant Je pense que OP signifie 'ith-parameter' par' pi' –
@HansPassant C++ est maintenant allé tout le chemin: vous n'avez plus besoin d'écrire tout le code! Les ellipses sont en fait du code et sont en cours d'exécution! –