我有一个函数getTotal:
int getTotal( const HitMap& hitMap, bool( *accept)(int chan) )
其中第二个参数是bool函数,指定应将容器hitMap的哪些成员添加到总数中。
我正试图用lambda调用它。这有效:
auto boxresult =
getTotal(piHits, [](int pmt)->bool
{ return (pmt/100) == 1;} );
但这不是:
int sector = 100;
auto boxresult =
getTotal(piHits, [sector](int pmt)->bool
{ return (pmt/sector) == 1;} );
我收到错误
cannot convert ‘main(int, char**)::<lambda(int)>’ to ‘bool (*)(int)’
for argument ‘2’ to ‘int getTotal(const HitMap&, bool (*)(int))’
来自我的编译器(GCC 4.6.3)。我尝试了[§or]
和[=sector]
,但没有任何区别。
我做错了什么?
答案 0 :(得分:16)
当lambda具有capture子句时,它不能再被视为函数指针。要更正,请使用std::function<bool(int)>
作为getTotal()
的参数类型:
int getTotal( const HitMap& hitMap, std::function<bool(int)> accept)
答案 1 :(得分:3)
带捕获的lambda函数不是您所期望的,您可以使用以下方法:
template <typename F>
int getTotal( const HitMap& hitMap, F accept )
{
}
或
int getTotal( const HitMap& hitMap, std::function<bool(int)> accept )
{
}
基于getTotal
的模板具有更好的性能。 Read more