7

我有一个函数 getTotal:

int getTotal( const HitMap& hitMap, bool( *accept)(int chan) )

其中第二个参数是一个布尔函数,指定容器 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]但没有任何区别。

我究竟做错了什么?

4

2 回答 2

16

当 lambda 具有捕获子句时,它不能再被视为函数指针。要更正,std::function<bool(int)>请用作 的参数类型getTotal()

int getTotal( const HitMap& hitMap, std::function<bool(int)> accept)
于 2013-04-22T11:28:29.493 回答
3

带有捕获的 lambda 函数不是您所期望的,您可以使用以下方式:

template <typename F>
int getTotal( const HitMap& hitMap, F accept )
{

}

或者

int getTotal( const HitMap& hitMap, std::function<bool(int)> accept )
{

}

基于模板的getTotal性能更好。阅读更多

于 2013-04-22T11:32:30.200 回答