103 votes

Fonctions de retour

Je me demande si il est possible d'écrire une fonction qui retourne une fonction lambda en C++11. Bien sûr, un problème est de savoir comment déclarer une telle fonction. Chaque lambda a un type, mais que le type n'est pas exprimable en C++. Je ne pense pas que cela fonctionnera:

auto retFun() -> decltype ([](int x) -> int)
{
    return [](int x) { return x; }
}

Ni ce:

int(int) retFun();

Je ne suis pas au courant de toute les conversions automatiques de lambdas, par exemple, les pointeurs de fonctions, ou quelque chose du genre. Est la seule solution confectionnant vous-même un objet de fonction et de le retourner?

110voto

Sean Points 15363

Vous n'avez pas besoin d'objet de fonction fabriqué à la main, utilisez simplement std::function , auquel les fonctions lambda sont convertibles:

 std::function<int (int)> retFun() {
    return [](int x) { return x; };
}
 

30voto

user534498 Points 1441

Pour cet exemple simple, vous n'avez pas besoin de std::function.

À partir de la norme 5.1.2/6

La fermeture pour un type lambda-expression sans lambda-capture a un public de non-virtuel non-explicite const fonction de conversion de pointeur de fonction ayant le même paramètre et les types de retour de la fermeture du type de la fonction d'appel de l'opérateur. La valeur retournée par cette fonction de conversion doit être l'adresse d'une fonction qui, lorsqu'il est appelé, a le même effet que l'invocation de la fermeture du type de la fonction d'appel de l'opérateur.

Parce que votre fonction ne possède pas de capture, cela signifie que le lambda peut être converti en un pointeur de fonction de type int (*)(int):

typedef int (*identity_t)(int); // works with gcc
identity_t retFun() { 
  return [](int x) { return x; };
}

C'est ma compréhension, corrigez-moi si je me trompe.

24voto

dzhioev Points 137

Vous pouvez renvoyer une fonction lambda à partir d'une autre fonction lambda, car vous ne devez pas spécifier explicitement le type de retour de la fonction lambda. Il suffit d'écrire quelque chose comme ça dans une portée globale:

  auto retFun = []() {
     return [](int x) {return x;};
 };
 

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