52 votes

Le «type» d'une expression lambda peut-il être exprimé?

En considérant les expressions lambda comme un «sucre syntaxique» pour les objets appelables, le type sous-jacent non nommé peut-il être exprimé?

Un exemple:

 struct gt {
    bool operator() (int l, int r) {
        return l > r;
    }
} ;
 

Maintenant, [](int l, int r) { return l > r; } remplace élégamment le code ci-dessus (plus la création nécessaire d'objets appelables de gt), mais existe-t-il un moyen d'exprimer gt (le type) lui-même?

Un usage simple:

 std::set<int, gt> s1;  // A reversed-order std::set
// Is there a way to do the same using a lambda?
std::set<int, some-magic-here-maybe([](int l, int r) { return l > r; }) > s2;
 

60voto

Johannes Schaub - litb Points 256113

Non, vous ne pouvez pas le mettre en decltype parce que

Une lambda-expression ne doivent pas apparaître dans un opérande non évaluée

Vous pouvez effectuer les opérations suivantes si

auto n = [](int l, int r) { return l > r; };
std::set<int, decltype(n)> s(n);

Mais c'est vraiment laid. Notez que chaque expression lambda crée un nouveau type unique. Ensuite, si vous effectuez les opérations suivantes ailleurs, t a un type différent de s

auto n = [](int l, int r) { return l > r; };
std::set<int, decltype(n)> t(n);

Vous pouvez utiliser std::function ici, mais notez que cela entraînera un tout petit peu de runtime coût, car elle a besoin d'un appel indirect à la fonction lambda appel de l'objet de l'opérateur. C'est probablement négligeable ici, mais peut être important si vous souhaitez passer de la fonction des objets de cette façon à l' std::sort par exemple.

std::set<int, function<bool(int, int)>> s([](int l, int r) { return l > r; });

Comme toujours, le premier code de profil :)

1voto

Crazy Eddie Points 23778

Réponse directe à votre question: non.

Vous devrez utiliser quelque chose qui soit assignable à partir de tout type ressemblant à un foncteur ayant un type bien défini. Un exemple est std :: function, comme indiqué dans la réponse de sbi. Ce n'est cependant pas le type de l'expression lambda.

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