Typedef pour lambda récursif

Existe-t-il un moyen de créer un typedef tel que ce qui suit (une implémentation “pure” de base du y-combinator) serait compilé?

 typedef ??? f; [](fx){x(x);} ([](fx){x(x);}); 

Cela a pour effet de créer un “lambda récursif”, c’est-à-dire qui s’appelle en utilisant un deuxième lambda pour obtenir une référence à lui-même. x dans le premier lambda est une référence au deuxième lambda, donc x(x) appelle le deuxième lambda avec une référence à lui-même. Ensuite, le deuxième lambda revient en appelant x(x) . Ce code, une fois exécuté, devrait produire une boucle infinie jusqu’à ce qu’il atteigne le dépassement de capacité de la stack. Des implémentations plus sophistiquées de la deuxième fonction peuvent produire un comportement récursif arbitraire.

J’ai essayé de typedef différentes versions de void(*)(...) mais je ne crois pas que cela puisse réussir. La métaprogrammation de mon modèle n’est pas assez puissante pour gérer ce genre de chose.

Celui-ci, ça va?

 #include  #include  struct X { template X(F f) : _f(f) { } void operator () (std::function f) { std::cout << "Calling myself..." << std::endl; _f(f); } std::function _f; }; int main() { typedef X f; [](fx){x(x);} ([](fx){x(x);}); }