Я написал функцию foreach
, которая принимает лямбда-функцию ala:
void foreach(void (*p)(pNode))
{ /* ... */ }
Которая работает как задумано, если я передаю лямбда-функцию из основного цикла:
int a = 5;
env.N().foreach
(
[&](pNode n)->void
{
n->tps(a);
}
);
Однако, если Я пытаюсь вызвать ту же функцию из метода-члена, лямбда-функция «наследует» область действия функции-члена и генерирует ошибку компилятора.Например, если я попытаюсь включить его в метод-член класса Object
с именем method ()
, я получаю следующую ошибку:
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]
Я понимаю, что компилятор безопасен , поскольку я мог бы включить переменные, зависящие от экземпляра, внутри лямбда-функции, и в этом случае лямбда должна быть ограничена, однако мне интересно, можно ли сделать эту лямбда «статической».
Я пробовал reinterpret_cast
, однако это дает мне эту ошибку:
error: invalid cast from type ‘Object::method()::<lambda(pNode)>’ to type ‘void (*)(pNode)’
Указание static
перед [&] (pNode ...
тоже не похоже на допустимый синтаксис.
В отчаянии я также попытался изменить [&]
на [=]
, []
, [a]
, но ни один из них не помог.
Кто-нибудь знает, есть ли способ достичь моей цели по созданию «статической» лямбда-функции или какой-либо другой лямбда-функции, которая будет принята в этом отношении?
Спасибо!
Ответ:
С помощью Cat Plus Plus , мне удалось превратить мой неправильный код:
void foreach(void (*p)(pT))
{
for(pTiter i = _map.begin(); i != _map.end(); i++)
{
(*p)(i->second);
}
}
в полностью функциональный код:
void foreach(std::function<void(pT)>(p))
{
for(pTiter i = _map.begin(); i != _map.end(); i++)
{
p(i->second);
}
}
, который отлично выполняет то, что я искал.