C++11包装器(function和bind)

文章目录

包装器

std::function

std::function的作用是统一类型,用于将不同类型的函数用相同的类型表示从而实现多态

本质上是一个类模板,其实例化对象可以包装存储其它可调用对象,包括仿函数,lambda等,格式为function<返回值类型(参数类型)>

储存的对象被称为std::function的目标,若std::function不含目标,则称为空,调用空的目标会抛出异常

cpp 复制代码
int add(int a, int b) { return a + b; }//普通函数

struct Mul {
    int operator()(int a, int b) { return a * b; }
};//仿函数

class MyClass{
public:
	static int s_add(int a,int b){
		return a+b;
	}

	int add(int a,int b){
		return a+b;
	}
};

int main() {
    function<int(int, int)> f;//创建一个空std::function
    
    f = add;//装普通函数

    f = Mul();//装仿函数

    f = [](int a, int b) { return a - b; };//装lambda函数
	    
	f=&MyClass::s_add;//装静态成员函数,需要使用&取地址并声明类域

	//装普通成员函数,也需要使用&并声明类域,还需要在std::function模板里加入类或类指针,以接收this指针
	function<int(MyClass,int,int)> c_f;
	function<int(MyClass*,int,int)> p_f;
	c_f=&MyClass::add;
	p_f=&MyClass::add;
	//调用时需要将实例化的对象传进去,如果模板里是指针,则需要传地址进去
	MyClass mc;
	cout<<c_f(mc,1,1)<<endl;
	cout<<p_f(&mc,1,1)<<endl;

    function<void()> empty_func;
    // empty_func();//没有目标的std::function不能调用
	
    return 0;
}

bind

绑定是一个函数模板,也是一个可调用对象的包装器,对接收的fn可调用对象处理后返回一个可调用对象,用于调整参数的顺序和数量

auto newfunc=bing(func,arg_list),使用auto来接收返回值,调用newfunc的时候会自动调用func,并将arg_list传进去

arg_list并不是参数列表,而是newfunc中的参数的顺序,用_1,_2来表示将newfunc中的第几个参数传到func,若不用_1,则表示形参或实参

cpp 复制代码
void func(int a, int b)
{
    cout << a << " " << b << endl;
}
int main()
{
    //调整参数顺序:把 newfunc 的第1个参数 给 func 的第2个位置
    auto newfunc1 = bind(func, _2, _1);
    newfunc1(10, 20); // 调用 show(20,10)

    //固定参数:第一个参数固定为 100
    auto newfunc2 = bind(func, 100, _1);
    newfunc2(200);    // 调用 show(100,200)

    //减少参数数量
    auto newfunc3 = bind(func, 66, 88);
    newfunc3();       // 调用 show(66,88)
}
相关推荐
大不点wow5 分钟前
为什么 Spring 更推荐构造器注入,而不是字段 `@Autowired`
java·spring·intellij-idea
沫璃染墨6 分钟前
现代C++⊂C++11篇(一)列表初始化全解 & std::initializer_list
开发语言·c++
阿米亚波14 分钟前
【C++ STL】std::forward_list
开发语言·c++·笔记·stl·visual studio·forward_list
用户2986985301427 分钟前
Java 创建 CSV 文件的三种实用方法:从零构建、数组写入与 Excel 转换
java·后端·excel
buhuizhiyuci30 分钟前
【python篇——一周速通python语法】python的条件语句和循环语句
开发语言·python
geovindu33 分钟前
go: Recursion Algorithm
开发语言·后端·算法·golang·递归算法
Cry丶34 分钟前
一次 FTP 上传引发 504 Gateway Timeout 的排查复盘
java·nginx·ftp·openresty·被动模式·504 gateway·生产问题排查
geovindu39 分钟前
CSharp: Composite Pattern
开发语言·后端·c#·组合模式·结构型模式
码农进化录40 分钟前
Java 程序员的 AI 进化论 | AI 辅助 CI/CD,让 AI 帮你做代码审查和部署决策
java·spring boot·openai
zyplayer-doc42 分钟前
企业文档的进化:网盘和在线文档的下一个升级方向—知识库系统
java·大数据·数据库·人工智能·ocr