来源:微信公众号「编程学习基地」
概述
std::bind,它是一个函数适配器,接受一个可调用对象(callable object),生成一个新的可调用对象来“适应”原对象的参数列表。
头文件是
#include<functional>
std::bind函数有两种函数原型,定义如下:
template< class F, class... Args >
/*unspecified*/ bind( F&& f, Args&&... args );
template< class R, class F, class... Args >
/*unspecified*/ bind( F&& f, Args&&... args );
std::bind返回一个基于f的函数对象,其参数被绑定到args上。
f的参数要么被绑定到值,要么被绑定到placeholders(占位符,如_1, _2, …, _n)。
1 std::bind绑定普通函数
#include<iostream>
#include <functional>
using namespace std;
/*static */int fun(int x,int y,int z)
{
std::cout << x << endl;
std::cout << y << endl;
std::cout << z << endl;
return x + y + z;
}
int main()
{
auto function = std::bind(fun, std::placeholders::_1, 2 ,3);
std::cout <<"std::bind 绑定普通函数"<< function(10) << '\n';
}
bind
的第一个参数是函数名_1
表示占位符,位于中,std::placeholders::_1
,此外还有std::placeholders::_2
等。- 第一个参数被占位符占用,表示这个参数以调用时传入的参数为准,在这里调用NewCallable时,给它传入了10,其实就想到于调用callableFunc(10,2,3);
输出结果如下
10
2
3
std::bind绑定普通函数15
2 std::bind绑定一个成员函数
#include<iostream>
#include <functional>
using namespace std;
class Base
{
public:
int fun_sum(int x, int y, int z)
{
std::cout << x << endl;
std::cout << y << endl;
std::cout << z << endl;
return x + y + z;
}
int m_data = 30;
};
int main()
{
Base base;
auto newiFunc = std::bind(&Base::fun_sum, &base, std::placeholders::_1,100, std::placeholders::_2);
std::cout << "std::bind 绑定成员函数" << newiFunc(20, 21) << '\n';
}
- bind绑定类成员函数时,第一个参数表示对象的成员函数的指针,第二个参数表示对象的地址。
- 必须显示的指定&Base::fun_sum,因为编译器不会将对象的成员函数隐式转换成函数指针,所以必须在Base::fun_sum前添加&;
- 使用对象成员函数的指针时,必须要知道该指针属于哪个对象,因此第二个参数为对象的地址 &base;
- 占位符占用的是函数调用参数的顺序,必须从
_1
起连续的占用
输出结果如下
20
100
21
std::bind 绑定成员函数141