7

関数getTotalがあります:

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

ここで、2 番目の引数は、コンテナー hitMap のどのメンバーを合計に追加するかを指定する bool 関数です。

私はラムダでそれを呼び出そうとしています。これは機能します:

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

ラムダにキャプチャ句があると、関数ポインターとして扱うことができなくなります。修正するにはstd::function<bool(int)>、 の引数の型として使用しgetTotal()ます。

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

キャプチャを使用したラムダ関数は期待したものではありません。次の方法を使用できます。

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 に答える