J'ai essayé d'utiliser une expression de Lambda C ++ 11 avec curlopt_writère, mais le programme se bloque au moment de l'exécution avec une violation d'accès. Je ne sais pas comment regarder plus loin dans cela en raison du manque de connaissances C ++ 11, mais peut-être que quelqu'un d'autre a une idée de faire ce travail.
La fonction: p>
wrote = data->set.fwrite_func(ptr, 1, len, data->set.out);
4 Réponses :
libcurl est une bibliothèque de plaine C, vous devez définir un rappel pouvant être appelé d'un tel. Cela signifie que des choses drôles C ++ doivent être «c'ifiés» d'abord au travail. Comme dans un pointeur de fonction de style ancien. P>
Ceci est également abordé dans l'entrée de la FAQ libcurl " Utilisation de fonctions non statiques C ++ pour Callbacks? " P>
Voir aussi: Callbacks de style C dans C ++ 11 P >
Vous pouvez réellement le faire en casnant la fonction Lambda au pointeur de la fonction. Vous pouvez d'abord faire une tâche à faire de manière simple.
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, static_cast<CURL_WRITEFUNCTION_PTR>(curl_callback));
Je suppose que c'est une coïncidence heureuse que la classe de fonctions Lambda a un pointeur de fonction comme premier et unique champ.
Drôle. Taille de la fonction Lambda capturée vide est 1. tandis que Taillef-références La fonction Lambda capturée est 8.
Je dois me corriger. J'ai regardé l'assemblée générée. Le statique_cast n'est pas résolu au moment de la compilation, il invoque une fonction à l'exécution qui "convertit" la Lambda à un pointeur de fonction.
@ Andrépuel Toutes les fonctions Lambda apatrides ont un pointeur de conversion de l'opérateur implicite. Dans chaque compilateur avec l'appui de la convention appelant, j'ai joué avec, il prend même en charge la convertie-appel-appel-convention-convention-functeur-pointeur. Vous n'avez même pas besoin de voter explicitement, vous pouvez simplement initialiser une variable du type approprié. Le casting est requis car sans elle, vous collez la Lambda apatride directement sur la pile, et non le pointeur de fonction que le moteur attend. Voir [ stackoverflow.com/questions/ 25513380 / C-Style-Callbacks-in-C 11 / ...
Casting de la Lambda au pointeur de fonction approprié fonctionne pour moi sous Linux:
auto curl_callback = static_cast<size_t(*)(char*,size_t,size_t,void*)>([](...){...});
Ceci peut être fait avec le préfixe +, qui renvoie plutôt un pointeur de fonction de style C. Mais cela ne fonctionne que avec des lambdas apatrides (liste de capture vide, c'est-à-dire []). ou P> curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, +[](void *ptr, size_t size, size_t nmemb, void *stream) -> size_t {
// does nothing at the moment due to testing...
return size * nmemb;
});
Quel compilateur utilisez-vous? VC ++? Si tel est le cas, VC ++ ne prend pas en charge les conversions implicites par le pointeur Lambda-fonction (encore?).
Oui, j'utilise VS2010 SP1. J'ai déjà remarqué les autres questions couvrant les fonctions de Lambda et les pointeurs de fonction mais ne pouvaient pas voir la connexion à ma question. Je suppose que je vais juste devoir attendre la prochaine version vs: / Les solutions de contournement étaient tout à fait ... déroutant.