1

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

もちろん、これは機能せず、「非静的メンバー関数への参照を呼び出す必要があります」というエラーが発生しました。その後、Reference to non-static member function must be calledHow to initialize std::functionwith a member-function? を見ました。ここでいくつかの他の質問。これが機能しなかった理由は理解していますが、これを解決する方法がわかりません。

誰かが私を助けて、この問題を解決する方法を教えてもらえますか?

4

3 に答える 3

6

メンバー関数のアドレスを取得するには、正しい構文を使用する必要があります&Foo::idxPointCompareXidxPointCompareX

ただし、関数を呼び出すオブジェクトも必要なFooので、バインドする必要があります。thisおそらく、次を使用できるようにそれを呼び出すつもりですstd::bind

using namespace std::placeholders;
stl::nth_element(begin, begin+n, end,
                 std::bind(&Foo::idxPointCompareX, this, _1, _2));

または、より簡単に、ラムダ関数を使用します。

stl::nth_element(begin, begin+n, end, 
                 [this](int a, int b) { return idxPointCompareX(a, b);}
);

これにより、this引数をキャプチャして、キャプチャされたポインターの idxPointCompareX 関数に渡すラムダ関数が作成されthisます。

于 2015-11-16T09:39:57.457 に答える