如何在这个类中使用成员函数调用stl :: nth_element?

Dan*_*gel 1 c++ stl member-function-pointers nth-element

我想nth_element在一个类中使用我自己的排序函数(它应该可以访问对象的数据).目前,我正在做以下事情:

class Foo
{
 public:
   glm::vec3 *points;
   int nmbPoints;

   bool idxPointCompareX(int a, int b);
   void bar();
}

bool Foo::idxPointCompareX(int a, int b)
{return points[a].x < points[b].x;)

void Foo::bar()
{
   stl::vector<int> idxPointList;
   for(int i = 0; i < nmbPoints; i++) idxPointList.push_back(i);  

   stl::nth_element(idxPointList.first(),idxPointList.first()+nmbPoints/2,idxPointList.end(), idxPointCompareX);
}
Run Code Online (Sandbox Code Playgroud)

当然,这不起作用,我得到错误:"必须调用非静态成员函数的引用".之后,我看了一下参考非静态成员函数必须调用,如何std::function用成员函数初始化?以及其他一些问题.我理解为什么这不起作用,但我不确定如何解决这个问题.

有人可以帮助我并告诉我如何解决这个问题吗?

Jon*_*ely 6

要获取成员函数的地址,您需要使用正确的语法,即&Foo::idxPointCompareX不仅仅是idxPointCompareX

但是你还需要一个Foo对象来调用函数,所以你需要将一个对象绑定到它.大概你的意思是打电话给你,this所以你可以使用std::bind:

using namespace std::placeholders;
stl::nth_element(begin, end, std::bind(&Foo::idxPointCompareX, this, _1, _2));
Run Code Online (Sandbox Code Playgroud)

或者更简单,使用lambda函数:

stl::nth_element(begin, end, 
                 [this](int a, int b) { return idxPointCompareX(a, b);}
);
Run Code Online (Sandbox Code Playgroud)

这将创建一个lambda函数,该函数捕获this并将其参数传递给捕获this指针上的idxPointCompareX函数.