Лямбда-функции C ++ 11 внутри методов-членов наследуют область видимости

Я написал функцию 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);
    }
}

, который отлично выполняет то, что я искал.

7
задан Community 23 May 2017 в 12:05
поделиться