Parcourir un tableau Internet J'ai rencontré ce petit défi:
"Implémentez une fonction anonyme récursive dans votre langue préférée" p> blockQuote>
évidemment c'est facile à l'aide d'un pointeur STD :: Fonction / Fonction. P>
Ce que je suis vraiment intéressé, c'est si cela est possible sans lier la Lambda à un identifiant? p>
quelque chose comme (ignorant la récursion infinie évidente): p>
xxx pré> p>
4 Réponses :
Êtes-vous autorisé à tricher? Il est récursif - indirectement, au moins. p> Sinon, non, il n'y a aucun moyen de faire référence à la Lambda elle-même sans attribution de c'est un nom. P> p>
Solution intéressante, mais un nom de fonction est également un identifiant, non?
@user: Bien sûr, mais la question n'interdit pas une récursion indirecte. :)
A{}(); // Thanks MooningDuck
C'est fondamentalement la même chose que ma réponse, une indirection à travers une fonction nommée. En outre, WTF nouveau A code>.
@Mm. Vous pouvez éviter le WTF en faisant l'opérateur statique ou (en C ++ 11) a {} () code>. En outre, le "nom" de la fonction est
a :: opérateur () code>, il est donc effectivement identique à celui de Xeo.
L'identifiant est opérateur () code>. Vous pouvez même appeler
a.opérator () (); code>. En outre,
a () () code>.
@Xeo: Nous pouvons l'appeler dans la façon dont vous avez dit, mais un identifiant ne doit pas avoir entre parenthèses. Donc, c'est juste un moyen de l'appeler. Mais opérateur () code> n'est pas un identifiant.
@Mm. Je viens de tester, il semble que les opérateurs ne puissent pas être statiques. Et vous avez raison, un nom n'est pas un identifiant. Cela a un nom, mais la fonction n'a aucun identifiant. Il n'a qu'un identifiant.
§13.5 / 1 code> " fonction opérateur- id i> b>" et
§1.6 / 2 code> "noms des catégories syntaxiques ont Généralement été choisi selon les règles suivantes: - [...] - x-ID est un identifiant b> sans signification dépend du contexte (par exemple, identifiant qualifié). "
@Xeo: Eh bien, il montre que c'est un nom i> pas un identifiant i>, mais un identifiant i> est un cas particulier d'un nom i >.
Non, cela ne montre pas que, lisez à nouveau: "Noms pour les catégories syntaxiques". Cela fait référence à "X-ID" (ou "ID de fonctionnement-fonctionnement") lui-même.
Bien sûr, en C ++, pour appeler toute fonction em> que vous devez la lier à un identifiant quelque part, simplement en raison des contraintes de syntaxe. Mais, si vous acceptez des paramètres comme suffisamment Sans nom, il est possible de créer une version de la combinaison Y en C ++ qui recute gentiment sans être "nommée". Maintenant, c'est vraiment moche parce que je ne le fais pas Savoir comment faire un Typedef pour une lambda récursive . Donc, cela utilise simplement beaucoup d'abus de fonte. Mais, cela fonctionne et imprime Les deux lambdas sont Sans nom dans le sens que ni est explicitement attribué au nom n'importe où. La deuxième Lambda est le vrai cheval de travail, qui s'appelle essentiellement en utilisant la première Lambda pour obtenir une référence à elle-même sous la forme du paramètre. P> Voici comment vous utiliseriez cela pour faire cela "utile" Travail: P> volez !! code> jusqu'à ce que cela segfault due à un débordement de pile. P>
#include <iostream>
typedef int param_t;
typedef int ret_t;
typedef void(*f0)();
typedef ret_t(*f)(f0, param_t);
int main() {
/* Compute factorial recursively */
std::cout << [](f x, param_t y) {
return x((f0)x, y);
} ([](f0 x, param_t y) {
if(y == 0)
return 1;
return y*((f)x)(x, y-1);
}, 10) << std::endl;
}
Je semble avoir monté une solution de mienne:
#include <iostream> int main() { std::cout<<"Main\n"; [&](){ std::cout<<"Hello!\n"; (&main+13)(); }(); }
C'est un comportement totalement non défini.
13 Sur votre compilateur + compilateur drapeaux + processeur + combinaison de système d'exploitation, segfault pour tous les autres! Yay!
Utilisez le Combinateur de point fixe et vous pouvez transformer n'importe quelle fonctionnalité en une tâche récursive.
N'as-tu voulu aucun identifiant ou ne vouliez-vous vraiment dire anonyme? C ++ peut avoir des noms non anonymes composés d'identificateurs i> mais sont eux-mêmes des identificateurs.
Par aucun identifiant, je veux dire aucun nom de variable