C++11特性总结(4)-参数绑定 bind函数

456 阅读2分钟

什么是bind函数

前面介绍了lambda表达式,lambda表达式是在每次调用的顺便写的一个小函数,即写即用,无法重复使用,好处是不会打破代码原有的整体性。不过如果我们对于一个功能如果要反复调用的话,就要用bind函数

bind函数用于把某种形式的参数列表与已知的函数进行绑定,形成新的函数。这种更改已有函数调用模式的做法,就叫函数绑定。此时bind相当于函数适配器的功能,对已有的函数进行修改,得到新的函数。

使用方法

头文件: <funtional>

格式:auto fun = bind(functionName, arg_list) //前面的类型一定是auto

其中arg_list 是参数列表,如果我们在调用函数的时候要通过bind函数传参给函数的话,就要用placehoders占位符,其头文件也是<funtional>,placeholders的命名空间是std::placeholders

#include <iostream>
#include <functional>
void fun(int a,int b)
{
    std::cout<<a<<" "<<b<<std::endl;
}
int main()
{
    auto f1 = bind(fun,std::placeholders::_1,std::placeholders::_2); //调用f1的时候要传递2个参数
    auto f2 = bind(fun,5,std::placeholders::_1); //调用f2的时候要传递1个参数,作为fun的第2个参数,第1个参数为指定的固定参数5
    auto f3 = bind(fun,5,std::placeholders::_2); 
    f1(3,2);  //cout:3  2
    f2(3);  //cout:5  2
}

在这里,f1函数在用fun的时候,就把传递的参数3,2,替换placeholders占位符placeholders_n表示调用bind函数时需要传递的参数顺序(第i个参数就绑定到placeholders_i上),而不是原函数的参数顺序。另外也可以把这些占位符换成固定值,也会照样按顺序传递给fun。

传值方式

在默认情况下,bind函数的参数传递都是值传递,即传的是拷贝值。

如果要传递引用,则需要使用标准库ref函数,该函数返回一个可以拷贝的对象,其中包含了原对象的引用。这里其实没有改变传值的方式,还是要做值传递,因为普通的引用是无法拷贝的。所以通过ref返回的对象里面封装了一个引用,这个对象的类型其实是reference_wrapper

对应的,还有cref函数,返回一个含有const引用的reference_wrapper对象,使得被调用函数不能改变其值(好处就在于避免了原对象的拷贝)。