C ++ 11 Lambda函数内部成员方法继承范围

时间:2011-06-13 22:48:01

标签: c++ lambda member-functions c++11

我编写了一个函数foreach,它接受​​一个lambda函数ala:

void foreach(void (*p)(pNode))
{ /* ... */ }

如果我从主循环传递lambda函数,那么它的工作原理是什么:

int a = 5;
env.N().foreach
(
    [&](pNode n)->void
    {
        n->tps(a); 
    }
);

但是,如果我尝试从成员方法中调用相同的函数,则lambda函数“继承”成员函数的范围并生成编译器错误。例如,如果我尝试将其包含在名为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]

我意识到这是编译器是安全的,因为我可以在lambda函数中包含特定于实例的变量,在这种情况下lambda将需要作用域,但是我想知道是否可以使这个lambda“静态” ”

我尝试了reinterpret_cast,但这给了我这个错误:

error: invalid cast from type ‘Object::method()::<lambda(pNode)>’ to type ‘void (*)(pNode)’

static之前指定[&](pNode ...似乎也不是有效的语法。

绝望地,我也尝试将[&]更改为[=][][a],但都没有效果。

有没有人知道是否有办法实现我创建“静态”lambda函数的目标,或者是否可以接受任何类型的lambda函数?

谢谢!


答案:

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 个答案:

答案 0 :(得分:8)

好吧,你不能使用指针。

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