std::function是什么?

news/2025/1/16 21:37:52/文章来源:https://www.cnblogs.com/chhblogs/p/18675787

std::function
std::function 是 C++ 标准库中定义在 头文件中的一个类模板,它是一个通用的多态函数封装器,可以用来存储、复制以及调用任何可调用对象,如普通函数、Lambda 表达式、函数对象、绑定表达式等。
主要特点

通用性:能够封装各种类型的可调用对象,无论是简单的函数指针,还是复杂的类成员函数,亦或是带有特定上下文环境的 Lambda 表达式等,都可以通过 std::function 来统一管理。
多态性:可以存储不同类型的可调用对象,调用时根据存储的对象类型自动进行相应的调用操作,无需用户手动处理不同类型的调用细节。
可复制性:支持复制操作,可以方便地将一个 std::function 对象复制给另一个,复制后的对象会共享相同的调用行为。
基本用法
定义和初始化

1空初始化

std::function<void()> func;

直接初始化 普通函数

void print_hello() { std::cout << "Hello" << std::endl; }
std::function<void()> func1 = print_hello;

Lambda 表达式

std::function<int(int, int)> func2 = [](int a, int b) { return a + b; };

绑定表达式

struct MyClass {void member_func(int x) { std::cout << x << std::endl; }
};
MyClass obj;
std::function<void(int)> func3 = std::bind(&MyClass::member_func, obj, std::placeholders::_1);

调用


func1();  // 调用 print_hello 函数
int sum = func2(3, 4);  // 调用 Lambda 表达式,计算 3 + 4
func3(5);  // 调用 MyClass 的成员函数 member_func,传入参数 5

检查是否为空
empty() 成员函数


if (func.empty()) {std::cout << "func is empty" << std::endl;
} else {std::cout << "func is not empty" << std::endl;
}
operator bool()if (func1) {std::cout << "func1 is not empty" << std::endl;
} else {std::cout << "func1 is empty" << std::endl;
}

获取目标类型和目标对象

target_type()if (func1.target_type() == typeid(void (*)())) {std::cout << "func1 targets a free function" << std::endl;
}
target()auto* lambda = func2.target< decltype([](int a, int b) { return a + b; })>();
if (lambda) {std::cout << "func2 targets a lambda expression" << std::endl;
}

应用场景
1 回调函数:在很多需要使用回调函数的场景中,std::function 可以方便地封装各种类型的回调函数,使得回调函数的使用更加灵活和通用。例如,在事件处理、异步编程等场景中,可以将不同类型的函数或对象作为回调函数传递给相应的处理函数或类。
2 算法参数:在使用标准库算法时,如果需要传递自定义的函数或函数对象作为算法的参数,std::function 可以提供一种方便的方式来封装这些参数,使得算法的使用更加灵活。
3 函数指针替代品:在一些原本需要使用函数指针的地方,使用 std::function 可以避免函数指针的一些限制,如无法直接封装成员函数、Lambda 表达式等,同时还能提供更强大的功能和更好的类型安全性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/870308.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

对rpc长连接与短连接的思考

RPC项目中长连接和短连接各有优劣,长连接适用于少量客户端,提高效率;短连接则更适合大量客户端,避免服务器过载。结合L4和L7负载均衡,合理选择连接方式,提升系统性能和稳定性。对rpc长连接与短连接的思考 对于rpc项目,在接受大佬指导的时候曾问过对于长连接和短连接是如…

【Windows攻防】通过代码研究空字节和无文件方式注册表隐藏技术

这篇文章收录于《取证实录》第四季中。 注册表隐藏技术通常用于恶意软件、后门程序或攻击者企图在系统中保持隐蔽,绕过安全检查和防御系统。 常见的隐藏技术有:使用非法字符隐藏注册表项(如PlugX、TDL4/Alureon(Rootkit))、利用默认键值(空字符串)隐藏(如Adwind RAT)…

DVWA靶场学习

暴力破解Brute Force low 输入密码就正常抓包放字典破解得了uploading-image-528180.png medium 同样的操作发现响应速度变慢了,但是还是能暴力破解,不多说了。 uploading-image-408161.png 部分源码解读 $user = $_GET[username]; $user = ((isset($GLOBALS["___mysqli…

推荐几个不错的 Linux 服务器管理工具

前言 选择一款好的 Linux 服务器管理工具能够极大地提高运维效率,保障业务连续性。今天大姚给大家分享3款不错的 Linux 服务器管理工具,希望可以帮助到有需要的同学。 1Panel 1Panel是新一代的 Linux 服务器运维管理面板,旨在通过现代化的 Web 界面帮助用户轻松管理 Linux 服…

学习进度笔记⑩

Tensorflow线性回归 源代码:import tensorflow as tfimport numpy as npimport matplotlib.pyplot as pltimport osos.environ["CUDA_VISIBLE_DEVICES"]="0"#设置训练参数,learning_rate=0.01,training_epochs=1000,display_step=50learning_rate=0.01…

学习进度笔记⑨

tensorflow基本操作(类似numpy) 源代码import tensorflow as tf import os os.environ["CUDA_VISIBLE_DEVICES"]="0" #构造计算图,创建两个常量节点a,b,值分别为2,3 a=tf.constant(2) b=tf.constant(3) #创建一个Session会话对象,调用run方法,运行…

利用AI大模型实现个性化视频配音

最近,作者决定拍摄短视频分享AI技术的应用,并遇到了配音问题。由于家中环境嘈杂且设备不够专业,作者尝试了机器配音,但效果不佳。作者转而想到AI大模型支持语音识别,于是开始寻找语音合成模型。最终在阿里云百炼平台上找到了通义千问-语音合成CosyVoice大模型,多个音色都…

【取证工具】Magnet AXIOM中文绿色版(更新8.4)

Magnet AXIOM取证工具介绍 Magnet AXIOM 是一款功能强大的数字取证工具,专为法律执行人员、调查员和安全专家设计,用于从各种数字设备中提取、分析和报告证据。AXIOM 提供了全面的取证支持,能够从电脑、移动设备、云端服务以及物联网设备中收集并分析数据。多平台支持 Magne…

介绍1个简单好用的英文文本翻转网站,关键还免费不用登录

输入英文,会 生成对应的翻转、反向、镜像、𝕆𝕦𝕥𝕝𝕚𝕟𝕖 𝔽𝕠𝕟𝕥、𝓒𝓾𝓻𝓼𝓲𝓿𝓮 𝓛𝓮𝓽𝓽𝓮𝓻𝓼的文本可以用于生成密码,聊天时发消息,猜字符的场景,欢迎使用和访问,简单免费,无需登录 比如你想她啦,不好意思说…

[Babel] Intro Babel - 01 Introduction

Babel介绍 Babel 是一个编译器,主要用于将最新的 JavaScript 代码转化为向后兼容的代码,以便在老版本的浏览器或环境中运行。 例如,你可能在开发时使用了 ES6、ES7 或者更高级的 JavaScript 特性,但是有些浏览器可能并不支持这些新特性,这时就可以用 Babel 来将代码转化为…

Babel Intro Babel - 01 Introduction

Babel介绍 Babel 是一个编译器,主要用于将最新的 JavaScript 代码转化为向后兼容的代码,以便在老版本的浏览器或环境中运行。 例如,你可能在开发时使用了 ES6、ES7 或者更高级的 JavaScript 特性,但是有些浏览器可能并不支持这些新特性,这时就可以用 Babel 来将代码转化为…

unordered_map-STL容器

时间复杂度和空间复杂度