捕获打破了我的lambda函数

时间:2013-04-22 11:25:49

标签: c++ c++11 lambda

我有一个函数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)。我尝试了[&sector][=sector],但没有任何区别。

我做错了什么?

2 个答案:

答案 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