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

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

это делает то, что я искал отлично.

1 Ответ

8 голосов
/ 14 июня 2011

Ну, вы не можете использовать указатели.

void foreach(std::function<void(pNode)>);
...