C++11包装器function和bind示例详解

 更新时间:2026年05月15日 09:23:30   作者:阿旭超级学得完  
本文介绍了C++中的std::function和bind函数,std::function可以将不同类型的函数用相同的类型表示,实现多态,bind函数可以对接收的fn可调用对象处理后返回一个可调用对象,用于调整参数的顺序和数量,感兴趣的朋友跟随小编一起看看吧

包装器

std::function

std::function的作用是统一类型,用于将不同类型的函数用相同的类型表示从而实现多态
本质上是一个类模板,其实例化对象可以包装存储其它可调用对象,包括仿函数,lambda等,格式为function<返回值类型(参数类型)>
储存的对象被称为std::function的目标,若std::function不含目标,则称为空,调用空的目标会抛出异常

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,则表示形参或实参

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)
}

到此这篇关于C++11包装器function和bind示例详解的文章就介绍到这了,更多相关C++包装器function和bind内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Visual Studio 2022 上使用ffmpeg的详细步骤

    Visual Studio 2022 上使用ffmpeg的详细步骤

    文章介绍了在开发项目中配置FFmpeg库的步骤,添加包含目录、库目录、依赖项及动态库路径,确保编译器和链接器正确识别FFmpeg资源,最后通过测试验证配置有效性,感兴趣的朋友一起看看吧
    2025-07-07
  • C语言求两个字符串的最长公共子串

    C语言求两个字符串的最长公共子串

    这篇文章主要介绍了C语言求两个字符串的最长公共子串,实例分析了C语言操作字符串的技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-02-02
  • C语言实现大整数加减运算详解

    C语言实现大整数加减运算详解

    大数运算,顾名思义,就是很大的数值的数进行一系列的运算。本文通过实例演示如何进行C语言中的大整数加减运算,有需要的可以参考借鉴。
    2016-08-08
  • 基于c++11的event-driven library的理解

    基于c++11的event-driven library的理解

    这篇文章主要介绍了基于c++11的event-driven library的理解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02
  • C++中单链表操作的示例代码

    C++中单链表操作的示例代码

    这篇文章主要为大家详细介绍了C++中单链表操作的示例代码,主要包括单链表的创建、元素的插入和删除等。文中的代码简洁易懂,需要的可以参考一下
    2022-10-10
  • C++堆排序算法的实现方法

    C++堆排序算法的实现方法

    这篇文章主要介绍了C++堆排序算法的实现方法,很经典的算法,需要的朋友可以参考下
    2014-08-08
  • C++中vector的清理回收的方式

    C++中vector的清理回收的方式

    这篇文章主要介绍了C++中vector的清理回收的方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • 解析C++无锁队列的实现代码

    解析C++无锁队列的实现代码

    本篇文章是对C++无锁队列的实现进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • 详解C++ 多态的两种形式(静态、动态)

    详解C++ 多态的两种形式(静态、动态)

    这篇文章主要介绍了C++ 多态的两种形式,帮助大家更好的理解和学习c++,感兴趣的朋友可以了解下
    2020-08-08
  • 实例讲解C++编程中对设计模式中的原型模式的使用

    实例讲解C++编程中对设计模式中的原型模式的使用

    这篇文章主要介绍了C++编程中对设计模式中的原型模式的使用实例,包括原型模式中对C++的深拷贝和浅拷贝的处理,需要的朋友可以参考下
    2016-03-03

最新评论