34 votes

Fonction factice () - Qu'est-ce que c'est supposé être?

Donc, hier, j'ai lu cette question ici DONC, et suis tombé sur le meilleur voté réponse, qui a utilisé ce type de code pour appeler un lambda de manière récursive

std::function<void(int)>
    f {[&f](int i){
        // do something
    }},
    dummy((f(3), nullptr));

Je me demandais ce que l' dummy(...) part était d'environ donc j'ai fait quelques recherches mais impossible de trouver quoi que ce soit. Dans l'extrait de code fourni dans la réponse il y a l' <utility> - tête utilisé donc je suppose que la chose doit être déclarée quelque part, mais je n'ai toujours pas trouver quoi que ce soit.

Quelqu'un pourrait-il expliquer ce qu' dummy de la fonction (ou le foncteur) n', où il est déclaré et ce qu'il est habituellement utilisé pour?

Je veux dire, bien évidemment, dans l'exemple, il est utilisé pour appeler la fonction f. Mais quel est son véritable but?

NOTE: je sais que la question est un peu large, mais puisque je ne pouvais pas trouver toutes les informations à ce sujet, je ne pouvais pas le focus de la question sur un problème spécifique. Aussi j'espère que la réponse à mes questions vont aider les autres à trouver de l'information sur la mystérieuse dummy().

54voto

Angew Points 53063

Nous allons simplifier la déclaration un peu en utilisant des types simples et des expressions. Nous allons utiliser int au lieu de std::function<void(int)>, 42 au lieu de le lambda, et f += 1 au lieu de f(3):

int f{42}, dummy((f += 1, 0));

Pour le rendre encore plus évidente, nous pouvons également utiliser des accolades à la place des parenthèses pour le deuxième initialisation:

int f{42}, dummy{(f += 1, 0)};

De cette façon, il devrait être plus clair. C'est une déclaration qui déclare deux variables: f et dummy. f est initialisé avec des 42, et dummy est initialisé avec cette expression: (f += 1, 0). Que l'on utilise l'opérateur virgule pour d'abord évaluer f += 1, jeter le résultat, et ensuite utiliser la valeur 0 de initalise dummy.

Retour à la nonsimplified) déclaration:

Le type de ces deux variables f et dummy est std::function<void(int)>. Premier f est initialisé avec une valeur lambda. Ensuite, dummy est initialisé à l'aide d'une virgule expression. Le côté gauche de cette expression, f(3), est évaluée et oublié. Le côté droit, nullptr, est ensuite utilisée pour initialiser dummy. L'initialisation d'un std::function avec nullptr les résultats dans la création d'un vide std::function objet (le même que celui par défaut construit un).

Le but entier de dummy est de présenter quelques extra contexte sur la même ligne (= dans la même déclaration) dont f pourrait être invoquée.

18voto

user2079303 Points 4916

où [dummy] est déclarée

Dans la déclaration que vous montrez. Simplifié:

T f /* the declarator */, dummy /* the declarator */;

dummy n'est qu'un nom de variable, tout comme f. Ils sont tous deux déclarés dans la même déclaration.

Quelqu'un pourrait-il expliquer ce que la fonction factice (ou foncteur) ne

Je veux dire, bien évidemment, dans l'exemple, il est utilisé pour appeler la fonction f. Mais quel est son véritable but?

Qui est le véritable but. La seule raison pour laquelle il est déclaré, est de sorte qu' f pourrait être appelé au sein de la même déclaration, que ce qui était souhaité dans la question. La solution est stupide, mais c'est peut-être le désir.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X