2

我应该如何将结构内的函数作为函子传递?我认为这应该可以正常工作,但事实并非如此:

#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

您不能直接执行此操作,因为cmp它是一个成员函数,它需要三个参数:ij和不可见的隐式this指针。

要传递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

虽然@Thomas 的答案完全有效,但您甚至可以使用std::bindlambdas 来做更简单的操作,如下所示:

// 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 回答