0

この質問で提供された解決策をクラスで使用しようとしています。クラス内の述語関数で「remove_if」を使用しました。

    void classname::function1()
    {
    vector<NeighborPoint> neighbors;
    ....
    neighbors.erase(std::remove_if(neighbors.begin(),neighbors.end(),&classname::cannotMoveIn), neighbors.end()); 
    ...
    }

    bool classname::cannotMoveIn(NeighborPoint mp)
    {
        return !mp.inGridNotOccupied;
    }

そのコードは、クラスになく、述語がメンバー関数でない場合に機能します。ただし、remove_ifテンプレートと述語パラメーターの非互換性を示す長いエラーメッセージが表示されます(1つのエラーには次のものが含まれます:エラーC2064:termは1つの引数を取る関数に評価されません)。

注:このコードは、エージェントが移動できない隣接するグリッドセル(8つの可能なセルのうち)を削除することを目的としています。

誰かが何が悪いのか分かりますか?

4

2 に答える 2

1

そのコードは、クラスになく、述語がメンバー関数でない場合に機能します。

もちろん。インスタンスメソッドはグローバル関数のようなものではありません。this(呼び出されるオブジェクト)の追加の非表示パラメーターを取ります。ただし、関数で現在のオブジェクトを使用する必要はまったくないようです。そもそもなぜインスタンスメソッドにしたのですか?

を使用する必要がない場合はthis、静的メソッドにすることができます(スコープを除いて、通常の関数と同じです)。その後、以前と同じように通常の関数のように渡すことができます。述語関数よりも優れているのは、関数オブジェクト(関数オブジェクトを定義する必要があります。クラスから移動したくない場合はネストされたクラスにすることもできます)またはラムダ(Cがある場合)を使用することです。 ++ 11)。これにより、述語をremoveアルゴリズムにインライン化できるため、毎回関数ポインターを呼び出すよりも高速になります。

于 2012-06-07T18:41:04.423 に答える
1

使用std::bind

neighbors.erase(std::remove_if(neighbors.begin(),neighbors.end(),std::bind(&classname::cannotMoveIn, this, std::placeholders::_1)), neighbors.end());

さらに、@ Alsが指摘しているように、classname::cannotMoveInメソッドにはMoorePoint引数としてaが取られますが、ベクトルには。が含まれますNeighborPoint。これらのクラスが関連している場合でも、ベクトルのオブジェクトをスライスすることに注意してください(引数を値で取得しているため)。

あなたのメソッドには次の署名が必要だと思います。

bool classname::cannotMoveIn(const NeighborPoint &mp) const;
于 2012-06-07T02:38:44.527 に答える