C + 11 Fonctions Lambda intérieur méthodes membres de périmètre héritent
-
27-10-2019 - |
Question
J'ai écrit une foreach
fonction qui accepte une fonction lambda ala:
void foreach(void (*p)(pNode))
{ /* ... */ }
Ce qui fonctionne comme prévu si je passe une fonction lambda de la boucle principale:
int a = 5;
env.N().foreach
(
[&](pNode n)->void
{
n->tps(a);
}
);
Cependant, si je tente d'appeler la même fonction dans une méthode membre, la fonction lambda « hérite » de la portée de la fonction de membre et génère une erreur de compilation. Par exemple, si je tente de l'inclure dans la méthode membre de Object
nommée classe method()
, je reçois l'erreur suivante:
error: no matching function for call to ‘IDSet<Node>::foreach(Object::method()::<lambda(pNode)>)’
note: candidate is: void IDSet<T>::foreach(void (*)(IDSet<T>::pT)) [with T = Node, IDSet<T>::pT = pNode]
Je sais que c'est le compilateur d'être sûr, puisque je pourrais inclure des variables spécifiques à l'instance dans la fonction lambda, auquel cas le lambda aurait besoin d'être scope, mais je me demande s'il est possible de faire de ce lambda « statique ».
J'ai essayé reinterpret_cast
, mais qui me donne cette erreur:
error: invalid cast from type ‘Object::method()::<lambda(pNode)>’ to type ‘void (*)(pNode)’
Spécification static
avant [&](pNode ...
ne semble pas une syntaxe valide soit.
Désespérément, j'ai aussi essayé de changer [&]
à [=]
, []
, [a]
, dont aucun ne travaillait.
Est-ce que quelqu'un sait s'il y a un moyen de faire réaliser mon objectif de créer une fonction lambda « static », ou à toute sorte de fonction lambda qui sera acceptée pour cette question?
Merci!
Réponse:
Avec l'aide de Cat Plus Plus, j'ai pu tourner mon code incorrect:
void foreach(void (*p)(pT))
{
for(pTiter i = _map.begin(); i != _map.end(); i++)
{
(*p)(i->second);
}
}
en code entièrement fonctionnel:
void foreach(std::function<void(pT)>(p))
{
for(pTiter i = _map.begin(); i != _map.end(); i++)
{
p(i->second);
}
}
qui fait ce que je cherchais parfaitement.
La solution
Eh bien, vous ne pouvez pas utiliser des pointeurs.
void foreach(std::function<void(pNode)>);