7

我编写了一个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)’

指定staticbefore[&](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);
    }
}

这完全符合我的要求。

4

1 回答 1

8

好吧,你不能使用指针。

void foreach(std::function<void(pNode)>);
于 2011-06-13T22:51:58.567 回答