std::bind与std::function

std::bind与std::function

  • std::bind

调用std::bind的一般形式为

auto newCallable = bind(callable, arg_list);

newCallable本身是一个可调用对象,arg_list是一个用逗号分隔的参数列表。当我们调用newCallable的时候会调用callable并且传给它arg_list里面的参数

std::bind是c++11的新特性,它接受一个可调用对象生成一个新的可调用对象来适应原对象的参数列表。举一个例子

bool compare_num(int a, int b)
{
    bool ans = a < b;
    cout << ans << endl;
    return ans;
}

class my_toolbox
{
public:
    static int power_num(int a, int b)
    {
        int ans = pow(a, b);
        cout << ans << endl;
        return ans;
    }
};

上面是函数的定义,如果我们正常使用compare_num函数则需要传两个参数进去,写成例如如下的形式

compare_num(1, 3

如果我们使用了bind,就可以用下面的办法

auto test1_1 = bind(compare_num, 1, 2);
test1_1();

我们让原本需要传两个参数的函数现在将默认值1和2填了进去,调用的时候直接test1_1()就可以

如果我们想要有一个是默认参数,另一个是我们自己传

auto test1_2 = bind(compare_num, 1, placeholders::_2);

同时,bind还能够有调整传参数顺序的能力

auto test1_3 = bind(compare_num, placeholders::_2, placeholders::_1);
test1_3(5,6);

如果我们按照上面这样写,我们如果调用了test1_3,那么我们则调用了compare_num,并且将test1_3里面的第一个参数作为compare_num的第二个参数,test1_3里面的第二个参数作为compare_num的第一个参数

  • std::function

假设有这样几个不同类型的可调用对象

int add(int i, int j)
{
    return i + j;
}

auto mod = [](int i, int j){ return i % j; };

struct divide
{
    int operator()(int denominator, int divisor)
    {
        return denominator / divisor;
    }
};

我们希望做一个计算器,尝试使用键值对,不同的key表示不同的运算,于是想到了使用map, map的定义如下

map<string, int(*)(int, int)> binops

这样定义则只能够将add添加到map中,因为别的可调用对象无法匹配值的类型

fucntion可以帮助我们解决上面的问题,function的简单理解是

通过std::function对C++中各种可调用实体(普通函数、Lambda表达式、函数指针、以及其它函数对象等)的封装,形成一个新的可调用的std::function对象;让我们不再纠结那么多的可调用实体。一切变的简单粗暴。

function<int(int, int)> f1 = add;
function<int(int, int)> f2 = divide();
function<int(int, int)> f3 = mod;

我们可以这样使用

cout << f1(4, 2) << endl;
cout << f2(4, 2) << endl;
cout << f3(4, 2) << endl;

如果希望能够使用map将这些可调用对象调用,我们可以定义如下的map

map<string, function<int(int, int)>> binops_func;
binops_func.insert({"+", add});
binops_func.insert({"%", mod});
binops_func.insert({"/", divide()});

如果我们定义的函数中有重载函数

double add_2(int i, int j)
{
    return i + j;
}

float add_2(float i, float j)
{
    return i + j;
}

我们需要使用函数指针

//这句话表示fp_1指向一个函数,函数的参数是两个int,返回值是double,括号不能省略
double (*fp_1)(int, int) = add_2;
float (*fp_2)(float, float) = add_2;
binops_func.insert({"++", fp_1});
binops_func.insert({"+++", fp_2});

如果我们要使用map,如下代码可以实现

cout << binops_func["+"](10, 5) << endl;
cout << binops_func["%"](10, 5) << endl;
cout << binops_func["/"](10, 5) << endl;

代表key值为"+", 给函数传值为10,5

参考:C++ Primer

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值