2011-06-20 1 views
2

クラスのメンバー関数のローカル変数にstd::for_eachループを使用しています。私はfor_eachのラムダから同じクラスの別のメンバー関数を呼びたいと思います。以下は、私が何をしようとしているの簡単な例です:これをキャプチャして、メンバー関数にアクセスする必要がありますか?

void some_class::another_function() 
{ 
    cout << "error"; 
} 
void some_class::some_function(function<bool(const int)> &f) 
{ 
    vector<int> local_variable = {0,0,0,1,1,3,5,43}; 

    std::for_each(local_variable.begin(), local_variable.end(), 
      [&f](const int item) 
      { 
       if(!f(item)) 
        another_function(); 
      } 
} 

GCC 4.6は、(私はそれを行う必要があります)thisがキャプチャされていないことを私に語っています。それが最善の解決策ですか?それとも、私が必要とする機能だけをキャプチャするべきですか(しかし、それはより大きな構築物にとっては面倒かもしれません)?

答えて

5

GCCが正しい場合:thisのメンバ関数をラムダの中から呼び出すには、thisをキャプチャする必要があります。メンバー関数がデータメンバーに依存しない場合はstaticとし、thisをキャプチャする必要はありません。

"関数"はキャプチャできません。ローカル変数のみ(パラメータとthisを含みますが、特定のデータメンバーは含みません)。

+0

「this」を明示的に取り込むのではなく、[&]を使ってすべてを参照することができます。それは 'std :: for_each'を使ってローカル関数です。参照によってすべてを取得せず、コンパイラが生成したファンクタを潜在的に単純な関数ポインタに最適化する理由はありません。 –

+0

**無し**をキャプチャするラムダだけを関数ポインタに減らすことができます。しかし、キャプチャセットに関係なく、ラムダはインライン関数呼び出し演算子を持つクラスになり、 'std :: for_each'ループに直接インライン展開されます。 '[&]'を使ってすべてをキャプチャするのは、各変数を明示的にキャプチャするよりもタイピングが少なくなります。 –

1

メンバ関数を呼び出すには、thisをキャプチャする必要があります。これはかなり終わりです。

関連する問題