J'ai des difficultés à construire une fonction variadique qui effectue une tâche particulière. Pour mon exemple particulier, j'utilise des matrices 2x2 mais vous pouvez imaginer que mon problème se généralise à de nombreux types de données. Aussi, pour mon exemple, "oeil" est la matrice d'identité 2x2.Fonction variadique pour produit Kronecker
Ok, alors je voudrais construire une fonction variadic f dont les entrées peuvent être (pour donner 3 exemples):
f(Y, 2, Z, 5, X, 3)
f(X, 4)
f(X, 2, Y, 1)
où X, Y, Z sont des matrices, et les chiffres sont ints positifs. Elle doit retourner les produits de Kronecker pseudo-code suivant respectivement:
KroneckerProduct(eye, Y, X, eye, Z)
KroneckerProduct(eye, eye, eye, X)
KroneckerProduct(Y, X)
Donc, essentiellement, il applique une matrice à la position dans le produit de kronecker spécifié par l'int qui suit la matrice, et les remplissages dans des matrices entre identité. En raison de mon inexpérience avec les fonctions variées, je ne suis pas allé loin avec ça. Mon plus gros problème est d'étape récursif de la fonction variadique faire ce que je dois (voir les commentaires à la fin):
template<typename M, typename I, typename... Args>
arma::mat f(M matrix, I position, Args... args)
{
std::vector<arma::mat> matrixList;
while(position > matrixList.size())
{
matrixList.push_back(eye<arma::mat>(2,2));
}
matrixList(position-1) = matrix;
//Up until here, it's satisfied the first pair of arguments.
//However, if I call f(args...) now, it'll just re-initialize matrixList
}
Y at-il une solution de contournement que je suis absent?
Il est exactement la même solution en fonction récursive « normale » :) – Rakete1111
suggérez-vous que les choses après avoir déclaré matrixList devrait être mis dans une autre fonction g (std :: vecteur & matrixList, args ...), et faire une récursion dans g? Dans la mesure où je comprends les modèles variadiques, puisque g n'a qu'un seul argument précédant les arguments ..., les arguments ne seraient-ils pas déballés un à la fois? J'ai besoin d'eux déballés deux à la fois pour que les devoirs aient du sens. –
user2520385