bind类成员函数

首先描述一个情景:

先贴出代码:

class Solution
{
public:
    bool compare(int a, int b)
    {
        return a > b;
    }

    int function_t(vector<int> &numbers)
    {
        sort(numbers.begin(), numbers.end(), compare);
        for (auto iter = numbers.begin(); iter != numbers.end(); ++iter)
            cout<<*iter<<endl;
        return 0;
    }
private:
    int test = 1000;
};

类成员函数对数组进行排序,排序使用的是STL自带的sort函数。上述代码无法编译通过,因为对于sort而言,第三个参数是自定义的比较函数,其函数不能够为一个非静态类成员函数。

如果需要使用compare,可以有两种方案,第一种,将compare函数声明为全局函数;第二种,将compare函数设置为static静态函数。

方法1:

bool compare(int a, int b)
{
    return a > b;
}

class Solution
{
public:
    int function_t(vector<int> &numbers)
    {
        sort(numbers.begin(), numbers.end(), compare);
        for (auto iter = numbers.begin(); iter != numbers.end(); ++iter)
            cout<<*iter<<endl;
        return 0;
    }
private:
    int test = 1000;
};

方法2:

class Solution
{
public:
    static bool compare(int a, int b)
    {
        return a > b;
    }

    int function_t(vector<int> &numbers)
    {
        sort(numbers.begin(), numbers.end(), compare);
        for (auto iter = numbers.begin(); iter != numbers.end(); ++iter)
            cout<<*iter<<endl;
        return 0;
    }
private:
    int test = 1000;
};

现在考虑,如果在compare函数中,需要使用类私有变量test,则上述两种方法都无法完成。对于类static成员函数,是不能够操作类成员函数和变量的(类成员函数的第一个默认参数是this指针,但static函数没有this指针),一般的做法,是将this指针传入static函数。例如:

static bool compare(int a, int b, Solution *arg)
{
    Solution *p = (Solution *)arg;
    cout<<p->test<<endl;
    p->test++;
    return a > b;
}

compare(a, b, this);

这样在类静态函数compare中就可以操作当前对象的test变量。但对于sort排序函数而言,如何实现对this指针的传参?

解决方案:使用bind绑定器,关于bind绑定器的介绍就不在一一展开,这篇博文主要是阐述如何在类成员函数中操作类私有变量。

代码:

class Solution
{
public:
    bool compare(int a, int b)
    {
        test++;
        return a > b;
    }

    int function_t(vector<int> &numbers)
    {
        auto ff = bind(&Solution::compare, this, placeholders::_1, placeholders::_2);
        sort(numbers.begin(), numbers.end(), ff);
        cout<<test<<endl;
        for (auto iter = numbers.begin(); iter != numbers.end(); ++iter)
            cout<<*iter<<endl;
        return 0;
    }
private:
    int test = 1000;
};

对于类中的非静态成员函数而言,其第一个参数是默认的this指针,接下来是显式声明的形参,通过bind绑定器,为函数compare设置默认参数,第一个为this,剩余两个为占位符,这样

在sort函数中直接调用新函数指针ff,就可调用compare并默认传入了当前对象的this指针。

原文地址:https://www.cnblogs.com/scu-cjx/p/8398740.html