7

foreachラムダ関数 ala を受け入れる関数を作成しました。

void foreach(void (*p)(pNode))
{ /* ... */ }

メインループからラムダ関数を渡すと、意図したとおりに機能します。

int a = 5;
env.N().foreach
(
    [&](pNode n)->void
    {
        n->tps(a); 
    }
);

ただし、メンバー メソッド内から同じ関数を呼び出そうとすると、ラムダ関数はメンバー関数のスコープを "継承" し、コンパイラ エラーが発生します。たとえば、Objectという名前のクラスのメンバー メソッド内にそれを含めようとするmethod()と、次のエラーが発生します。

error: no matching function for call to ‘IDSet<Node>::foreach(Object::method()::<lambda(pNode)>)’
note: candidate is: void IDSet<T>::foreach(void (*)(IDSet<T>::pT)) [with T = Node, IDSet<T>::pT = pNode]

ラムダ関数内にインスタンス固有の変数を含めることができるため、これはコンパイラが安全であることを認識しています。その場合、ラムダをスコープする必要がありますが、このラムダを「静的」にすることが可能かどうか疑問に思っています。

を試しましたが、次のreinterpret_castエラーが表示されます。

error: invalid cast from type ‘Object::method()::<lambda(pNode)>’ to type ‘void (*)(pNode)’

staticbefore を指定[&](pNode ...しても有効な構文とは思えません。

必死に、 、 、 に変更しようとしました[&]が、どれもうまくいきませんでした。[=][][a]

「静的」ラムダ関数を作成するという私の目標を達成する方法があるかどうか、またはそのために受け入れられるラムダ関数の任意の種類で誰かが知っていますか?

ありがとう!


答え:

Cat Plus Plusの助けを借りて、間違ったコードを有効にすることができました。

void foreach(void (*p)(pT))
{
    for(pTiter i = _map.begin(); i != _map.end(); i++)
    {
        (*p)(i->second);
    }
}

完全に機能するコードに:

void foreach(std::function<void(pT)>(p))
{
    for(pTiter i = _map.begin(); i != _map.end(); i++)
    {
        p(i->second);
    }
}

それは私が探していたものを完全に実行します。

4

1 に答える 1

8

まあ、ポインタは使えません。

void foreach(std::function<void(pNode)>);
于 2011-06-13T22:51:58.567 に答える