2017-09-18 2 views
4

Est-il possible de passer une fonction lambda en fonction d'un certain type?Conversion de type pour lambda С ++

Par exemple, je

typedef double(*Function)(int, double); 

Comment puis-je convertir une fonction lambda du type?

+0

Il est logique que pour les lambdas sans valeurs fermées –

+2

Pourquoi utilisez-vous 'typedef' en ce jour et l'âge? –

+0

Voir [Passer lambda comme pointeur de fonction] (https://stackoverflow.com/q/28746744/1708801) –

Répondre

2

Vous pouvez utiliser std::function au lieu d'un pointeur de fonction ordinaire. Cela permettrait de tenir lambdas même quand ils ont des captures:

#include <iostream> 
#include <functional> 

typedef std::function<double(int, double)> Function; 

int main() 
{ 
    Function f; 
    int i = 4; 
    f = [=](int l, double d){ return i*l*d; }; 
    std::cout << f(2, 3); 
} 

[Live Demo]

6

Pour un lambda sans état, cette conversion est disponible implicitement:

Function f = [](int, double) -> double {}; 

Si vous voulez juste convertir l'expression lambda lui-même, vous pouvez utiliser l'opérateur + unaire pour y parvenir:

auto* p = +[](int, double) -> double {}; // p is of type double(*)(int, double) 

Un lambda avec une capture n'offre pas une telle conversion, puisqu'il n'est pas sémantiquement équivalent à une fonction (sans état) (ceci s'applique même dans le cas d'une capture par défaut qui ne finit pas par capturer quoi que ce soit).

+0

_ "unaire + opérateur" _ C'est génial! (Comme mentionné [ici] (https://stackoverflow.com/questions/46283731/a-function-definition-is-not-allowed-here-before-token#comment79533605_46283731) il y a encore des points blancs à explorer sur les cartes) . – user0042

+1

@ user0042 - C'est génial. Mais malheureusement, un certain compilateur grand public, qui restera sans nom, [étouffe toujours dessus] (http://rextester.com/BQND42154). – StoryTeller

+0

Voir https://stackoverflow.com/a/17822241/801894 pour une explication plus détaillée de l'option unary +. –