クラスのメンバー関数のローカル変数に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
がキャプチャされていないことを私に語っています。それが最善の解決策ですか?それとも、私が必要とする機能だけをキャプチャするべきですか(しかし、それはより大きな構築物にとっては面倒かもしれません)?
「this」を明示的に取り込むのではなく、[&]を使ってすべてを参照することができます。それは 'std :: for_each'を使ってローカル関数です。参照によってすべてを取得せず、コンパイラが生成したファンクタを潜在的に単純な関数ポインタに最適化する理由はありません。 –
**無し**をキャプチャするラムダだけを関数ポインタに減らすことができます。しかし、キャプチャセットに関係なく、ラムダはインライン関数呼び出し演算子を持つクラスになり、 'std :: for_each'ループに直接インライン展開されます。 '[&]'を使ってすべてをキャプチャするのは、各変数を明示的にキャプチャするよりもタイピングが少なくなります。 –