当前位置: 代码网 > it编程>编程语言>C/C++ > C++11包装器function和bind示例详解

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

2026年05月15日 C/C++ 我要评论
包装器std::functionstd::function的作用是统一类型,用于将不同类型的函数用相同的类型表示从而实现多态本质上是一个类模板,其实例化对象可以包装存储其它可调用对象,包括仿函数,la

包装器

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内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

  • C++文件流操作方式

    C++文件流操作方式

    引言在 c 语言中,文件操作依赖于file*和一系列函数(fopen、fread、fwrite、fprintf等)。这种方式虽然功能齐全,但存在类型不安全、容易... [阅读全文]
  • C++中的引用和inline 和 nullptr全面解析

    一.引用1.1引用的概念与定义引⽤不是新定义⼀个变量,⽽是给已存在变量取了⼀个别名,编译器不会为引⽤变量开辟内存空间, 它和它引⽤的变量共⽤同⼀块内存空间。⽐如:⽔壶传中李逵,宋江…

    2026年05月11日 编程语言
  • C++中锁的种类与使用实例详解

    C++中锁的种类与使用实例详解

    关于c++中锁的种类与使用optimized tool selectionc++ 标准库中有多种锁管理机制,各有不同的特性和适用场景:看这段代码中使用的是 st... [阅读全文]
  • C++数据结构排序算法详解

    C++数据结构排序算法详解

    一.基础排序算法1.冒泡排序(1)算法思想重复循环遍历,每次比较相邻的两个元素,如果前大于后就交换,这样每次最大的元素都会交换到最后,每次循环遍历时去掉最后的元... [阅读全文]
  • c++面向对象之对象的赋值详解

    c++面向对象之对象的赋值详解

    对象初始化:构造函数和复制构造函数在设计一个类时,往往要设计构造函数。一般对象的初始化使用构造函数初始化,如果没有构造函数则会使用默认构造函数。还可以用复制构造... [阅读全文]
  • C++ 配置文件管理神器 yaml-cpp 实战指南

    C++ 配置文件管理神器 yaml-cpp 实战指南

    在 c++ 项目开发中,配置管理是一个绕不开的话题。无论是服务端程序的端口监听、数据库连接池大小,还是游戏客户端的分辨率、音量设置,我们都不希望每次调整参数都需... [阅读全文]

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com