我编写了一个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
before[&](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);
}
}
这完全符合我的要求。