J'ai écrit un modèle variadique qui exécute un foncteur F
exactement N
fois et en accumulant le résultat. Maintenant, je me demande comment rendre ce modèle capable de traiter une quantité variable de paramètres d'index (template) actuellement nommés id
et dans le foncteur désiré x, y, z
. Ce que j'ai à l'esprit était un foncteur comme ci-dessous qui est exécuté comme si vous l'appeliez trois pour les boucles. Je me demande aussi si cela pourrait être résolu par des listes d'arguments.Fonction de modèle récursif itérant sur plusieurs paramètres de modèle
struct 3DFunctor {
template <int x, int y, int z>
static int run() {
return x*y*z;
}
};
Comportement souhaité doit être quelque chose comme:
accum_for<3,3,3>::get<3DFunctor>();
3DFunctor::run<0,0,0>(/*args ...*/) +
3DFunctor::run<0,0,1>(/*args ...*/) +
3DFunctor::run<0,0,2>(/*args ...*/) +
3DFunctor::run<0,1,0>(/*args ...*/) +
3DFunctor::run<0,1,1>(/*args ...*/) +
3DFunctor::run<0,1,2>(/*args ...*/) +
// ..
Exemple:
#include <iostream>
#include <string>
struct F {
template <int id>
static int run(int val) {
return id * val;
}
};
template<unsigned int n>
struct accum1d_for {
template <class Funct, class ... ArgTypes>
static auto get(ArgTypes ... args) -> decltype(Funct::template run<0>(args ...)) {
return (
accum1d_for<n-1>::template get<Funct>(args ...) +
Funct::template run<n>(args ...)
);
}
};
template<>
struct accum1d_for<0> {
template <class Funct, class ... ArgTypes>
static auto get(ArgTypes ... args) -> decltype(Funct::template run<0>(args ...)) {
return static_cast<decltype(Funct::template run<0>(args ...))>(0);
}
};
int main()
{
std::cout << accum1d_for<10>::get<F>(2.f) << std::endl;
}
Ajouté Comportement désiré – dgrat
a essayé un "using blah =" mais a eu une erreur de compilateur. Je ne sais pas si cela fonctionne dans les corps de la fonction. – dgrat
Quelle version de la langue? C++ 11, C++ 14 ou C++ 17? – max66