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.

Était-ce utile?

La solution

Eh bien, vous ne pouvez pas utiliser des pointeurs.

void foreach(std::function<void(pNode)>);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top