C++11 std::bind和std::function解析
Posted Overboom
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++11 std::bind和std::function解析相关的知识,希望对你有一定的参考价值。
1. std::function
std::function包含于头文件 #include中,可将各种可调用实体进行封装统一,包括
1. 普通函数
2. lambda表达式(匿名函数)
3. 函数指针
4. 仿函数(functor 重载括号运算符实现)
5. 类成员函数
6. 静态成员函数
下面给出示例代码进行解析:
#include <iostream>
#include <functional>
using namespace std;
std::function<bool(int, int)> fun;
//普通函数
bool compare_com(int a, int b)
return a > b;
//lambda表达式
auto compare_lambda = [](int a, int b) return a > b;;
//仿函数
class compare_class
public:
bool operator()(int a, int b)
return a > b;
;
//类成员函数
class compare
public:
bool compare_member(int a, int b)
return a > b;
static bool compare_static_member(int a, int b)
return a > b;
;
int main()
bool result;
fun = compare_com;
result = fun(10, 1);
cout << "普通函数输出, result is " << result << endl;
fun = compare_lambda;
result = fun(10, 1);
cout << "lambda表达式输出, result is " << result << endl;
fun = compare_class();
result = fun(10, 1);
cout << "仿函数输出, result is " << result << endl;
fun = compare::compare_static_member;
result = fun(10, 1);
cout << "类静态成员函数输出, result is " << result << endl;
// 类普通成员函数比较特殊,需要使用bind函数,并且需要实例化对象,成员函数要加取地址符
compare temp;
fun = std::bind(&compare::compare_member, temp, std::placeholders::_1, std::placeholders::_2);
result = fun(10, 1);
cout << "类普通成员函数输出, result is " << result << endl;
// 类成员函数也可以采用这种办法
std::function<bool(compare*, int, int)> func = &compare::compare_member;
compare compare_;
func(&compare_, 10, 1);
cout << "类普通成员函数输出, result is " << result << endl;
编译输出:
2. std::bind
std::bind函数将可调用对象(开头所述6类)和可调用对象的参数进行绑定,返回新的可调用对象(std::function类型,参数列表可能改变),返回的新的std::function可调用对象的参数列表根据bind函数实参中std::placeholders::_x从小到大对应的参数确定。下面以仿函数绑定为例,实现功能:比较输入数是否小于3:
//bind函数
std::function<bool(int)> fun2;
//返回新的可调用对象参数列表只有一个int,std::placeholders::_1表示compare_class()第一个参数
fun2 = std::bind(compare_class(), 3, std::placeholders::_1);
result = fun2(3);
cout << "bind函数测试, result is " << result << endl;
return 0;
这里重新写一个实例详细说明返回的新的std::function可调用对象的参数列表如何确定:
#include <functional>
#include <iostream>
using namespace std;
struct Int
int a;
;
bool compare_com(struct Int a, float b)
return a.a > b;
int main()
Int a = 1;
//placeholders::_1对应float, placeholders::_2对应struct Int所以返回值fun的类型为function<bool(float, Int)>
std::function<bool(float, struct Int)> fun = bind(compare_com, placeholders::_2, placeholders::_1);
bool result = fun(2.0, a);
cout << "result is " << result << endl;
return 0;
以上是关于C++11 std::bind和std::function解析的主要内容,如果未能解决你的问题,请参考以下文章
C++11 std::bind函数,std::function函数
C++11 std::bind std::function 变参函数
C++11 std::bind std::function 变参函数
C++11 std::bind和std::function解析