C++:std::function模板类

news2024/9/28 5:26:13

一:function定义

  • 类模板 std::function是一种通用的多态函数包装器,它的实例可以对任何可以调用的目标实体进行存储,复制和调用操作。
  • 简单的来说:C++中有几种可调用对象:函数,指针,lambda表达式,bind创建的对象,以及重载了调用运算符的类,function是一种类型,这种类型可以将上述不同类型对象,整合到一个类型中。
  • 它是对C++中现有的可调用实体的一种类型安全的包裹(相对来说,函数指针的调用不是类型安全的)

二:function实例

1:定义一个模板 :  typedef function<int(int)> Funtional

2:  此模板可以包装接收:普通函数,lambda函数,仿函数,静态成员函数,成员函数

#include<iostream>
#include<string>
#include<functional>
using namespace std;

// 声明一个模板
typedef function<int(int)> Functional;

// 普通函数
int testFunc(int a) {
	return a+1;
}

// lambda expression
auto lambda = [](int a)->int
{
	return a + 2;
};

// functor仿函数
class Functor
{
public:
	int operator()(int a) {
		return a + 3;
	}
};

// 类的成员函数和类的静态成员函数
class CTest {
public:
	int Func(int a) {
		return a + 4;
	}

	static int SFunc(int a) {
		return a + 5;
	}
};

int main() {
	// 封装普通函数
	Functional obj = testFunc;
	cout << "普通函数:" << obj(0) << endl;

	// 封装lambda表达式
	obj = lambda;
	cout << "lambda函数:" << obj(1) << endl;

	// 封装仿函数
	Functor fuctor;
	obj = fuctor;

	// 封装类的成员函数和类的静态成员函数
	CTest t;
	// 绑定类的成员函数,一定要传递对象给bind的第二个参数,可以是类对象,也可以是类对象的指针(这是因为成员函数有一个默认的this指针)
	obj = std::bind(&CTest::Func, &t, placeholders::_1);
	cout << "成员函数函数:" << obj(3) << endl;

	// 绑定静态的成员函数
	obj = CTest::SFunc;
	cout << "静态成员函数函数:" << obj(4) << endl;
}

案例2:定义一个 function类型,并作为形参传入类的成员函数,从Function 包装的:函数对象,全局函数,lambda表达式,函数指针这几种方式中,找到一种方式:满足形参赋值给类的成员变量 ------》(先说结论:只有lambda表达式可以实现:捕获对象,从而实现修改类的成员变量)

// main.cpp

#include "test.h"
#include<iostream>
#include<string>
#include<Functional>
using namespace std;

void MyTest::test(callback_ callback) {
	cout << "test call m_i = " << this->m_i << endl;
}

// 全局函数
void func(int i) {
	cout << "global func call m_i = " << i<< endl;
}

// lambda表达式
void lambda() {
	MyTest mytest;
	// lambda表达式:捕获对象 mytest引用,修改成员变量: m_i
	auto lambda = [&mytest](int i) {
		mytest.m_i = i;
		cout << "lambda 本体调用后 m_i = " << mytest.m_i << endl;
	};
	lambda(1);
	mytest.test(lambda);
	cout << "mytest m_i = " << mytest.m_i << endl;
}

// 函数对象(仿函数)
class FunObj
{
public:
	void operator()(int i) {
		cout << "func obj call m_i = " << i << endl;
	}
};

// 函数指针
void (*fun_pointer)(int i);

int main() {
	// lambda 方式:可以捕获当前对象,通过当前对象修改类的成员变量
	// lambda();

	// 全局函数方式(失败,由于function定义的是接收一个参数)(且不能 捕获当前对象,就不能通过当前对象修改类的成员变量)
	/*MyTest mytest1;
	callback_   _callback = func;
	_callback(1);
	mytest1.test(_callback);*/

	// 仿函数的方式(失败,由于function定义的是接收一个参数)(且不能 捕获当前对象,就不能通过当前对象修改类的成员变量)
	/*MyTest test;
	callback_   _callback = FunObj();
	_callback(1);
	test.test(_callback);*/

	// 函数指针方式 (待定)
	MyTest test1;
	callback_   _callback = fun_pointer;
	// _callback(1);
	// fun_pointer(1);
	test1.test(_callback);
}
// test.h


#pragma once
#include<functional>

using callback_ = std::function<void(int)>;
class MyTest
{
public:
	int m_i = 0;
	void test(callback_ callback);
private:

};

三:Functional原理 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

区块链之开发命令行操作模块

文章目录功能介绍go语言中flag用法简介项目命令行具体实现链接&#xff1a; 区块链项目github地址项目目前进度&#xff1a;功能介绍 利用命令行操作区块链相较于图形用户界面来说&#xff0c;编写代码简单&#xff0c;同时也可以实现复杂的功能。命令行模块的功能应该满足&am…

Java学习笔记 --- JDBC(1)

一、JDBC概述 基本介绍 1、JDBC为访问不同的数据库提供了统一的接口&#xff0c;为使用者屏蔽了细节问题 2、Java程序员使用JDBC可以连接任何提供了JDBC驱动程序的数据库系统&#xff0c;从而完成对数据库的各种操作 3、JDBC原理图 JDBC带来的好处 JDBC是Java提供一套用于数…

安卓移动端调用自然语言处理nlp模型【示例+源码】

安卓可以使用许多不同的方法来调用NLP模型。其中一种方法是使用现有的自然语言处理库,例如 Apache OpenNLP、 Stanford NLP 和 NLTK。这些库提供了许多常用的 NLP 功能,如分词、词干化、命名实体识别和词性标注。另一种方法是使用 TensorFlow Lite 或其他机器学习框架来加载并…

[ins 2022] 针对已见和未见群体的群体推荐中的贝叶斯归纳学习

Bayesian inductive learning in group recommendations for seen and unseen groupshttps://www.sciencedirect.com/science/article/pii/S0020025522008933摘要群组推荐是指向一组用户&#xff08;即成员&#xff09;推荐物品。在预测相关项目时&#xff0c;模型通常会面临未…

fs 文件系统模块

1、什么是 fs 文件系统模块 fs 模块是 Node.js 官方提供的、用来操作文件的模块。它提供了一系列的方法和属性&#xff0c;用来满足用户对文件的操作需求。 方法名 说明 fs.readFile() 用来读取指定文件中的内容 fs.writeFile() 用来向指定的文件中写入内容 如果要在 J…

webflux整合swagger教程V2版

1. yml文件配置 <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux</artifactId><version>2.1.0.RELEASE</version></dependency><!--数据库开始--&…

python @classmethod

1..什么是classmethod classmethod是用来指定一个类的方法为类方法 长的像下面这个样子 1 2 3 class cc: classmethod def f(cls, arg1, arg2, ...): ... cls通常用作类方法的第一参数 跟self有点类似&#xff08; __init__里面的slef通常用作实例方法的第一参数)。…

vue开发环境配置Visual Studio Code配置和安装教程

方便前端vue开发&#xff0c;使用vs code插件安装详细教程&#xff0c;关于vs code可以网络上相关的教程&#xff0c;插件安装如下图所示&#xff0c;大家常用的插件可再分享&#xff0c;与我联系。 1 安装Vue语法高亮显示插件&#xff1a;vetur 2 安装vue语法提示插件&#xf…

小孩上了半年小学,针对老师的评语总结,如何对症优化教育培养策略?chatGPT搜了一下,AI震惊了我

评语 班主任评语&#xff1a; 你是一个性格内向、聪明伶俐的男孩。平时能按时完成老师布置的作业&#xff0c;学习认真&#xff0c;成绩优良&#xff0c;做事认真。但有时自己的事情还不能自己完成&#xff0c;希望你以后可以独立起来&#xff0c;遇到问题多想办法&…

高性能网关基石——OpenResty

什么是 OpenRestyOpenResty 一个基于 Nginx 的高性能 Web 平台&#xff0c;能够方便地搭建处理超高并发的动态 Web 应用、 Web 服务和动态网关。例如有名的 Kong 网关和国产新秀 ApiSIX 网关都是基于 OpenResty 来进行打造的。OpenResty 通过实现 ngx_lua 和 stream_lua 等 Ngi…

Nmap工具使用

Nmap工具使用1.Nmap简介1.1.Nmap介绍1.2.Nmap功能介绍1.3.Nmap下载1.4.Nmap端口状态2.Nmap基本使用2.1.Nmap基础扫描2.2.Nmap基础扫描多个目标2.3.Nmap详细扫描输出2.4.Nmap指定端口扫描2.4.1.单端口扫描2.4.2.端口范围扫描2.4.3.端口组合扫描2.5.Nmap扫描排除2.5.1.排除一个主…

强大的ANTLR4(6)--设计语法

四种抽象的计算机语言模式&#xff1a; 1&#xff09;序列&#xff1a;一列元素&#xff0c;数组 2&#xff09;选择&#xff1a;在多个可选方案中做出选择 3&#xff09;词法符号依赖&#xff1a;例如左右括号匹配 4&#xff09;嵌套结构&#xff1a;一种自相似的语言结构。 …

lambda表达式入门

一、函数式编程思想 1 概念 面向对象思想需要关注用什么对象完成什么时期&#xff0c;而函数式编程思想更类似于我们数学中的函数&#xff0c;它主要关注的是对数据进行了什么操作 2 优点 代码简洁&#xff0c;开发快速接近自然语言&#xff0c;易于理解易于"并发编程…

计算机网络——BGP协议

BGP协议 和谁交换&#xff1a;与其他AS的邻站BGP发言人交换信息。 交换什么&#xff1a;交换网络可达性信息 多久交换一次&#xff1a;发生变化时更新有变化的部分 一般来说两个网络都是由一个BGP发言人连接的。 BGP协议交换信息的过程 BGP协议所交换的网络可达性的信息就…

Haproxy 代理后端服务

参考 http://www.haproxy.org HAProxy GitHub 目录 一、Haproxy环境准备 1、Haproxy简介 1.1、haproxy原理 1.2、Haproxy优点 2、在线apt安装 二、使用Haproxy 1、基本脚本结构示例 2、配置反向代理 3、验证haproxy 3.1、重启服务 3.2、访问后台管理 3.3、访问…

Linux下用gdb定位Qt程序崩溃位置(systemd-coredump)

目录1. systemd-coredump2. 用gdb定位崩溃位置Linux提供了systemd-coredump服务&#xff0c;可以配合gdb来定位到程序崩溃位置&#xff0c;下面介绍它们的用法。1. systemd-coredump systemd-coredump的简单介绍&#xff1a; systemd-coredump能从操作系统内核中获取内存转储&…

IDEA2022.1创建Maven web项目 + SpringMVC入门学习

SpingMVC 入门案例 文章目录SpingMVC 入门案例项目的结构1.导入SpringMVC和Servlet依赖2.创建SpringMVC控制器类&#xff08;等同Servlet&#xff09;3.初始化SpingMVC环境&#xff08;同Spring环境&#xff09;&#xff0c;设定SpringMVC加载对应的bean4.创建web容器启动类&am…

MWORKS.Sysplorer基于数据字典管理模型参数应用案例

1 引言 在面向微控制器的建模过程中&#xff0c;控制算法是可以复用到不同型号的同类产品中的。为了提高控制算法的可移植性&#xff0c;需要将模型与数据分开管理。如果不将模型与数据分开管理&#xff0c;直接将数据保存到模型中&#xff0c;即使在非批产的工程化应用或者小…

11.前端笔记-Bootstrap前端框架

1.Bootstrap简介 框架&#xff1a; 就是一台架构&#xff0c;有较为完整的网页功能解决方案&#xff0c;而且控制权在框架本身&#xff0c;有预制样式库、组件和插件。使用者要按照框架规定的规范进行开发 参考&#xff1a; 中文官网&#xff1a;http://www.bootcss.com 官…

Spring中实用的11个扩展点

我们一说到spring,可能第一个想到的是 IOC(控制反转) 和 AOP(面向切面编程)。 没错,它们是spring的基石,得益于它们的优秀设计,使得spring能够从众多优秀框架中脱颖而出。 除此之外,我们在使用spring的过程中,有没有发现它的扩展能力非常强。由于这个优势的存在,让…