如何将结构中的函数作为仿函数传递?我认为这应该可以正常工作,但它没有:
#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>
的
答案 0 :(得分:6)
你不能直接这样做,因为cmp
是一个成员函数,它需要三个参数:i
,j
和不可见的隐式{ {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 );} );