J'essaie de suivre cet exemple d'utiliser un lambda avec remove_if
. Voici ma tentative:
int flagId = _ChildToRemove->getId();
auto new_end = std::remove_if(m_FinalFlagsVec.begin(), m_FinalFlagsVec.end(),
[](Flag& device) {
return device.getId() == flagId;
});
m_FinalFlagsVec.erase(new_end, m_FinalFlagsVec.end());
mais cela ne compile pas:
error C3493: 'flagId' cannot be implicitly captured because no default capture mode has been specified
Comment puis-je inclure le paramètre extérieur, flagId
, dans l'expression lambda?
Vous devez spécifier flagId
à capturer. C'est ce que le []
partie est pour. Pour l'instant, il ne capture rien. Vous pouvez capturer ( plus d'infos ) par valeur ou par référence. Quelque chose comme:
auto new_end = std::remove_if(m_FinalFlagsVec.begin(), m_FinalFlagsVec.end(),
[&flagId](Flag& device)
{ return device.getId() == flagId; });
Qui capture par référence. Si vous voulez capturer par valeur const, vous pouvez faire ceci:
auto new_end = std::remove_if(m_FinalFlagsVec.begin(), m_FinalFlagsVec.end(),
[flagId](Flag& device)
{ return device.getId() == flagId; });
Ou par valeur mutable:
auto new_end = std::remove_if(m_FinalFlagsVec.begin(), m_FinalFlagsVec.end(),
[flagId](Flag& device) mutable
{ return device.getId() == flagId; });
Malheureusement, il n’existe aucun moyen simple de capturer par référence constante. Personnellement, je voudrais simplement déclarer une référence permanente temporaire et la capturer par la référence suivante:
const auto& tmp = flagId;
auto new_end = std::remove_if(m_FinalFlagsVec.begin(), m_FinalFlagsVec.end(),
[&tmp](Flag& device)
{ return device.getId() == tmp; }); //tmp is immutable