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

What is the proper way to reference a member function of a class?

本文关键字:方法 是什么 函数 成员 引用      更新时间:2023-10-16
#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中定义为上述的类中,我想使用成员函数Func使用data的CC_2订单向量。结果是错误

'c :: func':非标准语法;使用'&amp;'创建指向会员的指针

我相信这与为什么C 中不存在参考成员有关。

但是,我无法提出一种在std::sort中引用此功能的正确方法。如何正确实施?

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

您有几个选择:

如果您无法访问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;
}

快速而肮脏的方式:将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;
}