- 作者: 雪山肥鱼
- 时间:20211211 11:23
- 目的: 复习 bind
bind语义:
bind 用来 将 可调用对象和参数进行绑定。绑定后的结果用std::function进行保存,并延迟调用到我们需要的时候。即回调
需要
#include <function>
using namespace std;
using namespace std::placeholders
function + bind 组合经常一起出现
bind 的可调用对象包括:
普通函数
全局函数
静态函数
类静态函数
甚至类成员函数 (function 绑不了)
- 绑普通函数
#include <iostream>
#include <functional>
using namespace std;
int divide(int x, int y) {
return x/y;
}
//bind 绑定的是可调用对象及其参数
int main(int argc, char *argv[])
{
auto div = bind(divide, 10,2);
cout<<div()<<endl;
//cout<<div(20,2)<<endl;//没用了
/*
* 参数个数不匹配 是存在问题的
auto div2 = bind(divide, 10);
cout<<div2(3)<<endl;
*/
//placeholders 出场 是用来占位的
//auto div2 = bind(divide, placeholders::_1,30);
auto div2 = bind(divide, 10, placeholders::_1);
cout<<div2(2)<<endl;
auto div3 = bind(divide, placeholders::_1, placeholders::_2);
cout<<div3(30,10)<<endl;
//5对应第一个参数,10 对应第二个参数
auto div4 = bind(divide, placeholders::_2, placeholders::_1);
cout<<div4(5,10)<<endl;
return 0;
}
绑定普通函数,注意占位符,以继绑定参数必须符合绑定对象。
- 绑定对象与成员函数
绑成员函数,function 是做不到的
struct Pair {
int data;
double source;
};
class MyPair {
public:
void func() {
cout<<"class MyPair void func()"<<endl;
}
void func1(int x, int y) {
cout<<"calss MyPair func1()"<<endl;
}
};
int main(int argc,char **argv) {
//1. 绑定参k数
Pair p = {10, 2000};
auto obj = bind(&Pair::data, p);
cout<<obj()<<endl;
//2. 绑定成员函数
MyPair mp;
auto objfunc = bind(&MyPair::func, mp);
objfunc();
//auto objfuncArg = bind(&MyPair::func1, mp, plachodlers::_1, placholders::_2);
//objfuncArg(10, 20);
auto objfuncArg = bind(&MyPair::func1, mp, 10, 20);
objfuncArg();
return 0;
}
注意bind 参数的位置
-
函数
bind(函数名, 参数1,) -
对象:
构造对象
bind(要绑定东西,对象(绑定在谁身上),参数1,..) -
函数重载情形
int add(int x, int y) {
cout<<"int add"<<endl;
return x+y;
}
double add(double x, double y) {
cout<<"double add"<<endl;
return x+y;
}
class MyPair
{
public:
int add( int x, int y) {
cout<<"MyPair::int add"<<endl;
return x+y;
}
double add(double x, double y) {
cout<<"MyPair::double add"<<endl;
return x+y;
}
};
int main() {
//绑 函数
auto funcIntAdd = bind((int (*)(int, int))add, 10, 10);
funcIntAdd();
auto funcDoubleAdd = bind((double (*)(double, double))add, 10, 10);
funcDoubleAdd();
MyPair my;
auto funcClass = bind((int (MyPair::*)(int, int))&MyPair::add, my, 10, 20);
funcClass();
return 0;
}
多态之 bind + function
function 无法包装类成员函数,但bind 是可以实现 类成员函数绑定,然后复制给function对象,即实现了间接性的包装。
bind+function 可以实现接口统一的极大整合
void foo()
{
cout <<"void foo()"<<endl;
}
void func(int a)
{
cout<<"void func(int a)"<<endl;
}
class Foo
{
public:
void method()
{
cout<<"Foo::void method()"<<endl;
}
void method2(string s)
{
cout<<"Foo::void method2()"<<endl;
}
};
class Bar
{
public:
void method3(int a, string s) {
cout<<"Bar::void method3()"<<endl;
}
};
//统一
function<void(void)> f;
int main() {
f = foo;
f();
//f = func;//明显有问题 类型不服
f = bind(func, 100);
f();
Foo x;
f =bind(&Foo::method, x);
f();
f = bind(&Foo::method2, x, "china");
f();
f = bind(&Bar::method3, Bar(), 1, "china");
f();
return 0;
}
用function<void(void)> f; 去接所有
函数必须是 public, private 则不行哟。
网友评论