Utilisez decltype et std :: function avec lambda

Cela marche …

auto x = 4; typedef decltype(x) x_t; x_t y = 5; 

… alors pourquoi n’est-ce pas?

 int j = 4; auto func = [&] (int i) { cout << "Hello: i=" << i << " j=" << j << endl;}; typedef decltype(func) lambda_t; lambda_t func2 = [&] (int i) { cout << "Bye: i=" << i << " j=" << j << endl;}; 

… et comment déclarer lambda_t manuellement à l’aide de std :: function?

… alors pourquoi ça ne marche pas?

Parce que chaque instance lexicale d’un lambda a un type différent. Peu importe si les mêmes caractères sont utilisés.

.. et comment déclarer lambda_t manuellement à l’aide de std :: function?

Le lambda prend un argument int et ne retourne rien … Donc:

 typedef std::function lambda_t; 

Les types Lambda sont indétectables (ne peuvent pas être nommés), raison pour laquelle vous ne pouvez pas faire ce que vous demandez. De plus, chaque lambda est d’un type différent. Par conséquent, même si vous pouviez nommer le type, vous ne pourriez pas affecter le deuxième lambda au premier. Si vous considérez la syntaxe lambda comme un raccourci pour un object fonction, cela devient plus clair: le membre operator() est différent pour chaque lambda et ils sont donc de types différents.

Vous pouvez par contre affecter un lambda à un object std::function<> de la signature appropriée, qui dans votre cas serait std::function .

Voici quelques preuves solides que cela ne fonctionne pas. Scénario similaire:

 int foo = 3; int bar = 3; std::cout << (typeid(foo).hash_code() == typeid(bar).hash_code()); // prints one -- obviously - they are the same type 

Maintenant, utilisons exactement le même code, mais avec lambdas. Que pensez-vous que la réponse sera.

  auto foo = [](){std::cout << "HELLO\n"; }; auto bar = [](){std::cout << "HELLO\n"; }; std::cout << (typeid(foo).hash_code() == typeid(bar).hash_code()); // prints 0 -- different type even though they are declared exactly the same.