2

struct 内の関数をファンクターとして渡すにはどうすればよいですか? 私はこれがうまくいくはずだと思っていましたが、うまくいきませんでした:

#include <algorithm>
using namespace std;

struct s {
    int a[10];

    bool cmp(int i, int j) {
        // return something
    }

    void init() {
        sort(a, a + 10, cmp);
    }
};

取得する<unresolved overloaded function type>

4

2 に答える 2

6

これを直接行うことはできません。これは、 、、および非表示の暗黙的なポインターの3 つの引数cmpを必要とするメンバー関数であるためです。ijthis

に渡すcmpstd::sortは、 の特定のインスタンスに属さずs、したがってthisポインターを持たない静的関数にします。

static bool cmp(int i, int j) {
    // return something
}

へのアクセスが必要な場合は、代わりに単純な関数オブジェクトをthisラップできます。cmp

struct cmp {
    s &self;
    cmp(s &self) : self(self) { }
    bool operator()(int i, int j) {
        // return something, using self in the place of this
    }
};

そして、次のように呼び出します。

sort(a, a + 10, cmp(*this));
于 2012-11-24T16:26:06.280 に答える
2

std::bind@Thomasの回答は完全に機能していますが、次のようにまたはラムダを使用して、より簡単に行うこともできます。

// Using std::bind
std::sort( a, a + 10, std::bind(&s::cmp, this, _1, _2) );

// Using lambdas
std::sort( a, a + 1, [this](int i, int j) {return this->cmp( i, j );} );
于 2012-11-24T16:49:02.773 に答える