引用类的成员函数的正确方法是什么?

时间:2016-12-24 14:20:22

标签: c++ sorting std

#include <iostream>
#include <algorithm>
#include <numeric>
#include <vector>
using namespace std;

class C
{
public:
    vector<int> CSort();
    bool Func(int x, int y);
private:
    vector<int> data;
};

vector<int> C::CSort()
{
    vector<int> result(data.size(), 0);
    iota(result.begin(), result.end(), 0);
    sort(result.begin(), result.end(), Func);
    return result;
}

bool C::Func(int x, int y)
{
    return (data[x] > data[y]);
}

在上面定义的班级C中,我希望使用成员函数data获得std::sortFunc的订单向量。结果是错误

  

&#39; C :: Func&#39;:非标准语法;使用&#39;&amp;&#39;创建指向成员的指针

我认为这与Why doesn't reference-to-member exist in C++有关。

但是,我无法找到在std::sort中引用此功能的正确方法。我该如何正确实现它?

3 个答案:

答案 0 :(得分:1)

lambda会起作用:

#include <iostream>
#include <algorithm>
#include <numeric>
#include <vector>
using namespace std;

class C
{
public:
    vector<int> CSort();
    bool Func(int x, int y);
private:
    vector<int> data;
};

vector<int> C::CSort()
{
    vector<int> result(data.size(), 0);
    iota(data.begin(), data.end(), 0);
    sort(data.begin(), data.end(), [this](auto& l, auto& r) {return Func(l, r); });
    return result;
}

bool C::Func(int x, int y)
{
    return (data[x] > data[y]);
}

int main()
{
    C c;
}

或绑定:

#include <iostream>
#include <algorithm>
#include <numeric>
#include <vector>
#include <functional>

using namespace std;

class C
{
public:
    vector<int> CSort();
    bool Func(int x, int y);
private:
    vector<int> data;
};

vector<int> C::CSort()
{
    vector<int> result(data.size(), 0);
    iota(data.begin(), data.end(), 0);
    sort(data.begin(), data.end(), std::bind(&C::Func,this,std::placeholders::_1,std::placeholders::_2));
    return result;
}

bool C::Func(int x, int y)
{
    return (data[x] > data[y]);
}

int main()
{
    C c;
}

答案 1 :(得分:1)

您有几个选择:

如果您无法访问C ++ 11,您可以上学并实施自己的比较器来保存状态:

class C
{
    friend struct MyComp;
public:
    vector<int> CSort();
private:
    vector<int> data;
};

struct MyComp
{
    C* data;
    MyComp(C* data) : data(data) {}
    bool operator()(int x, int y)
    {
        return data->data[x] > data->data[y];
    }
};

vector<int> C::CSort()
{
    vector<int> result(data.size(), 0);
    iota(data.begin(), data.end(), 0);
    sort(data.begin(), data.end(), MyComp(this));
    return result;
}

但是,如果你这样做,你可以使用lambda:

vector<int> C::CSort()
{
    vector<int> result(data.size(), 0);
    iota(data.begin(), data.end(), 0);
    sort(data.begin(), data.end(), [this] (int x, int y) {
        return (data[x] > data[y]);
    });
    return result;
}

答案 2 :(得分:0)

快速而肮脏的方式:将Func移到课堂外。

#include <iostream>
#include <algorithm>
#include <numeric>
#include <vector>
using namespace std;

class C
{
 public:
  vector<int> CSort();
 private:
  vector<int> data;
};

bool Func(int x, int y) {
  return x > y;
}

vector<int> C::CSort()
{
  vector<int> result(data.size(), 0);
  // iota(data.begin(), data.end(), 0);
  sort(data.begin(), data.end(), Func);
  return result;
}