将结构(或类)的内部函数作为函子传递

时间:2012-11-24 16:24:06

标签: c++ stl functor function-object

如何将结构中的函数作为仿函数传递?我认为这应该可以正常工作,但它没有:

#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>

2 个答案:

答案 0 :(得分:6)

你不能直接这样做,因为cmp是一个成员函数,它需要三个参数:ij和不可见的隐式{ {1}}指针。

要将this传递给cmp,请将其设为静态函数,该函数不属于std::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
    }
};

答案 1 :(得分:2)

虽然@Thomas的答案完全正常,但您甚至可以使用std::bind或lambdas更简单地执行以下操作:

// 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 );} );