2011-07-25 11 views
2

私は、私は次の行ラムダ式変換

typedef std::vector<value3 const*> passmem; 
pasmem pm; // neighborhood sequence 
std::for_each(pm.begin(), pm.end(), [&] (value3 const* x) 
+10

:なぜここに

です。 –

+1

コードを変換したいものの説明だけでなく、 –

+0

関数の本体が何であるかに応じて、生成されるコードが異なる場合があるので、関数の本体を追加する必要があります。 –

答えて

4

ちょうどにラムダ式を変換する変換することができますどのように戻って、以前の標準に新しい標準を使用して書かれた機能(C++ 0xの)に変換する

をしようとしています関数名を付けてfor_eachのパラメータとして渡します。またちょうどのようなあなたのラムダ関数のインラインの機能を実行します。

for (pasmem::iterator it=pm.begin(); it != pm.end(); ++it) { 
     // Do the lambda functionality with *it 
    } 
+1

'it!= pm.end()'ではなく 'it it = pm.end();'ではなく '* it!= pm.end()'であると思います。 '++ it'も広く一般的に使われていると広く考えられています。特定のイテレータにとっては効率的ですが、実際には意味をなさないことはほとんどありません。 –

+1

は 'pm'がインスタンスを表し、インスタンスから型のメンバを抽出ではなく、タイプ(またはのtypedefの別名)を必要とすることはできません:'(passmemのために::)それは(pm.beginを=イテレータ... ' –

+0

ます私はそれを修正しました。 –

1
for(passmem::const_iterator i = pm.begin(); i != pm.end(); ++i) 
{ 
    const value3* x = *i; 
    // same as in lambda 
} 
1

ラムダを処理するための基本的なルールは、ラムダと同じシグネチャを持つoperator()を提供しています関数オブジェクトを作成する必要があります。キャプチャされたフィールドのそれぞれについて、メンバをファンクタに追加し、構築時に初期化する必要があります。 参照又はCONSTによるものであろうあなたの特定のケースでは、あなたのラムダが定義され、型が関与する場所に応じて、を参照。

非自明、ラムダは、ロ​​ーカル変数にベクトルの各要素の値を蓄積し、そして(value3は適切な演算子を持っていると仮定して)のために、場合:

struct accumulator__ { 
    value3 & v_; 
    accumulator__(value3 & v) : v_(v) {} 

    void         // for_each ignores the return value 
    operator()(value3 const * p) {  // same argument as lambda 
     v_ += *p; 
    } 
}; 

ラムダ場合[const]すべての参照を追加すること、すなわち(メンバ関数として定義され、そしてそれは、クラスの任意のメンバーにアクセスし、その後、物事は少しトリッキーになるだろうが、あなたは基本的にすべて手動でアクセスフィールドの閉鎖を作成しなければならないました実際のlambdas(私は信じている)はthisをキャプチャしますが、リファクタリングでは は、クラスのメンバーへのアクセス権を失う可能性があります。

0

まず、@ george272に解決策があります(ただし、イテレータは(c)itで、iではありません)。

あなたはは(ほとんど)がこれまでC++ 11にfor_each使用しないでください、あなたの元のコードに戻って。あなたの質問はいくつかのコードが欠けているように思わ

typedef std::vector<value3 const*> passmem; 
pasmem pm; // neighborhood sequence 
for(auto x : pm) 
{ 
    // do your stuff as normal but with less typing ;) 
} 
関連する問題