Conversion de l'expression lambda en pointeur de fonction
C'est une question de suivi à cette question: Lambda comment puis-je passer comme paramètre
MSDN a soi-disant marqué l'élément comme fixe. J'ai jeté un oeil aux spécifications, mais j'ai du mal à convertir leurs spécifications en ce que devrait être la syntaxe.
Par exemple:
void printOut(int(*eval)(int))
{
for(int x = 0; x < 4; ++x)
{
std::cout << eval(x) << std::endl;
}
}
Maintenant, dites que j'ai le lambda:
auto lambda1 = [](int x)->int{return x;};
Quelle est la syntaxe pour convertir lambda1
en l'équivalent du pointeur fonctionnel afin qu'il puisse être passé à printOut
?
Aussi, qu'en est-il des lambdas qui ont réellement quelque chose entre parenthèses? Par exemple:
int y = 5;
auto lambda2 = [y](void)->int{return y;};
Si ce type de lambda ne peut pas être converti en un pointeur de fonction, existe-t-il une méthode alternative pour passer ce type d'expression lambda à printOut
(ou même une version modifiée de printOut
, si oui, quelle est la syntaxe)?
1 réponses
Il n'y a pas de syntaxe en soi, c'est une conversion implicite. Il suffit de le lancer (explicitement ou implicitement) et vous obtiendrez votre pointeur de fonction. Cependant, cela a été corrigé après la sortie de Visual Studio 2010, il n'est donc pas présent.†
Vous ne pouvez jamais transformer un lambda de capture complet en un pointeur de fonction, comme vous l'avez noté, c'est donc la fonction printOut
qui devra changer. Vous pouvez généraliser la fonction elle-même:
// anything callable
template <typename Func>
void printOut(Func eval)
{
// ...
}
Ou généraliser le type de fonction particulier:
// any function-like thing that fits the int(int) requirement
void printOut(std::function<int(int)> eval)
{
// ...
}
Chacun a son propre compromis.
†pour autant que je sache, on ne sait pas si nous l'obtiendrons dans un service pack, ou si nous devons attendre une nouvelle version.