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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值