如何解决成员方法内部的C ++ 11 Lambda函数继承作用域
| 我编写了一个函数foreach
,它接受一个lambda函数ala:
void foreach(void (*p)(pNode))
{ /* ... */ }
如果我从主循环中传递了一个lambda函数,它将按预期工作:
int a = 5;
env.N().foreach
(
[&](pNode n)->void
{
n->tps(a);
}
);
但是,如果尝试从成员方法中调用相同的函数,则lambda函数“继承”成员函数的作用域并生成编译器错误。例如,如果尝试将其包含在名为method()
的类Object
的成员方法中,则会出现以下错误:
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)’
在[&](pNode ...
之前指定static
似乎也不是有效的语法。
拼命地,我也尝试将ѭ10更改为[=]
,[]
,[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);
}
}
那确实是我一直想要的。
解决方法
好吧,您不能使用指针。
void foreach(std::function<void(pNode)>);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。