关于c++种std::function和bind的用法
一、C++中的函数种类(包括c++11中的)
二、bind和function存在的意义
三、Bind的使用方法
四、Function的使用方法
Hello,各位看官,最近我研究了c++中的bind的使用情况(因为我的编译环境基本上就是在c++11中,所以bind1st和bind2nd就不研究了),顺便我们简单的来说一说std::function的使用方法。
一、C++中的函数种类
C++中的函数种类一共可以分成以下几种,首先是C语言普通函数(就是不在类里边的函数),第二种就是Lamada表达式,第三种就是类中的普通函数,最后一种就是类中的静态函数。我们可以简单的写一下这四个函数
// C语言普通函数
int funcAdd(int a, int b)
{
return a + b;
}
// Lamada表达式
auto lamabaAdd = [](int a, int b)->int {
return a + b;
};
// 类中的普通函数和静态函数
class A {
private:
int m_num;
public:
A(int num) : m_num(num) {}
int classAdd(int a, int b) {
return a + b;
}
static int staticAdd(int a, int b) {
return a + b;
}
};
二、Bind函数和function函数的意义
首先,我个人觉得bind函数和std::function函数所表达的意思差不多,就是把上面四种形式转换成一个形式。其二,有些函数参数当中需要使用bind函数。
三、bind的使用方法
我们仍旧以上面四个例子为例:
// C语言普通函数绑定成bind
auto bindCommon = std::bind(funcAdd, std::placeholders::_1, std::placeholders::_2);
int result = bindCommon(1, 2);
std::cout<<"commonresult is:"<<result<<std::endl;
auto bindCommon1 = std::bind(funcAdd, 2, 2);
result = bindCommon1();
std::cout<<"bindcommonresult is:"<<result<<std::endl;
我们看到,bind函数当中有两种表示方法,第一种就是不赋值,第二种就是指定值,那么如果不指定具体的值该怎么做呢?使用std::placeholders来进行占位,这个参数最多可以写9个。第二种就是指定相对应的值,比如上表达是种的2,2,这样,下面就不用再赋值了。
// Lamada表达式绑定成bind
auto bindLamadaAdd = std::bind(lamabaAdd, std::placeholders::_1, std::placeholders::_2);
result = bindLamadaAdd(3, 2);
std::cout<<"bindlamadaresult is:"<<result<<std::endl;
auto bindLamadaAdd1 = std::bind(lamabaAdd, 4, 2);
result = bindLamadaAdd1();
std::cout<<"bindLamadaresult is:"<<result<<std::endl;
A aa(10);
与C语言普通函数一样,也是有两种方法,这里就不多废话了。
// 类中普通函数的表示方法
A aa(10);
auto bindClassAdd = std::bind(&A::classAdd, aa, std::placeholders::_1, std::placeholders::_2);
result = bindClassAdd(5, 2);
std::cout<<"bindClassAddresult is"<<result<<std::endl;
auto bindClassAdd1 = std::bind(&A::classAdd, aa, 6, 2);
result = bindClassAdd1(6, 2);
类中的稍有不同,区别就是必须指定谁调用bind的表达式,以这个公式为例,aa.*(classAdd(6,2)),这样一种形式,用this指针亦可。
// 类中静态函数的表示方法
auto bindStaticAdd = std::bind(&A::staticAdd, std::placeholders::_1, std::placeholders::_2);
result = bindStaticAdd(7, 2);
std::cout<<"bindStaticAddResult is"<<result<<std::endl;
auto bindStaticAdd1 = std::bind(&A::staticAdd, 8, 2);
result = bindStaticAdd1();
std::cout<<"bindStaticAddResult1 is"<<result<<std::endl;
这个和C语言普通函数一样,就不多说了。
四、function的用法
Function的用法与bind基本一致,这里举一个例子。
std::function<int(int, int)> func;
func = funcAdd;
int result1 = func(6, 7);
这样就可以了。