C ++ 14 Introduisez des Lambdas génériques (lors de l'utilisation du mot-clé AUTO dans les signatures de la Lambda).
Y a-t-il un moyen de les stocker dans un vecteur avec C ++ 17? P>
Je sais À propos de cette question existante, mais cela ne convient pas à mes besoins: Puis-je avoir un STD :: Vector des pointeurs de la fonction de modèle? p>
Voici un exemple de code illustrant ce que j'aimerais faire. (Veuillez consulter les notes en bas avant de répondre) p> notes: p>
A code>,
b code> et
testtrunner code> ne peut pas être modifié, seul le code des cas de test li>
3 Réponses :
Il suive une solution possible (que je ne recommanderais pas, mais vous avez explicitement dit que vous ne voulez pas discuter si c'est bon ou faux, etc.).
Comme demandé, a code>,
b code> et
testtrunner code> n'a pas été changé (mettre de côté le fait que
auto code> n'est pas un Paramètre de fonction valide pour
Testrunner code> et je l'ai défini en conséquence).
Si vous pouvez modifier légèrement testtrunner code>, le tout peut être amélioré.
Cela étant dit, voici le code: auto l1 = [](auto &) { /* ... */ };
auto w1 = Wrapper<decltype(l1)>{std::move(l1)};
Auto est un paramètre de fonction valide pour TestRunner en C ++ 14 ( ideone.com/4931Ht )
Cette solution polymorphe est très intelligente +1.
@infiniteloop Voir le fonctionnement sur wandbox avec auto code>. Notez qu'il s'agit d'une extension GCC, pas d'un paramètre valide en C ++ 14 pour des fonctions libres.
Qu'est-ce que le Downvote exactement? O.o ... sachant que cela aiderait à améliorer la réponse ...
Fondamentalement ce que vous voulez, c'est une extension de Premièrement, nous avons besoin d'un appel d'appel virtuel pour une signature donnée: p> et quelque chose pour les regrouper: p> xxx pré> maintenant la partie ennuyeuse. Nous avons besoin d'un espace réservé std :: Fonction code>.
std :: fonction
appel () code> s. Il peut y avoir une meilleure façon de le faire, mais la meilleure façon dont je pouvais penser est d'avoir deux paramètres de modèle de frappe de frappe et de déplacer chaque signature de l'une à l'autre, car nous finissons avec eux: P>
std::vector<function<void(A&), void(B&)>> actions;
Il n'est pas possible de stocker des modèles de fonctions de quelque manière que ce soit, de la forme ou de la forme. Ce ne sont pas des données. (Les fonctions ne sont pas non plus données, mais les pointeurs de fonction sont). Notez qu'il existe STD :: Fonction, mais pas de std :: Function_Template. Il existe des fonctions virtuelles, mais pas de modèles de fonctions virtuels. Il y a des pointeurs de la fonction, mais pas de pointeurs de modèle de fonction. Ce sont toutes des manifestations d'un fait simple: il n'y a pas de modèles au moment de l'exécution.
Un Lambda générique n'est qu'un objet avec un opérateur Vous pouvez obtenir un ensemble de spécialisations de modèles finis et déterminé par la compilation de compilation pour me comporter comme un objet, mais ce n'est pas différent d'un objet, d'avoir un groupe fini de fonctions virtuelles (éventuellement surchargées). ou peu importe. Dans votre situation, c'est un équivalent d'avoir un P> () code> Modèle de fonction membre. Tout de ce qui précède s'applique également aux modèles membres. p>
std::vector <
std::tuple <
std::function<void(A&)>,
std::function<void(B&)>
>
>