我编写了一个函数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);
}
}
完全符合我的要求。
答案 0 :(得分:8)
好吧,你不能使用指针。
void foreach(std::function<void(pNode)>);