当前位置: 首页 > news >正文

C++23 std::bind_back:一种调用包装器 (P2387R3)

文章目录

    • 引言
    • 背景知识
      • 旧有的绑定工具
      • C++20的std::bind_front
    • std::bind_back的定义和功能
      • 定义
      • 功能
    • std::bind_back的使用场景
      • 简化回调函数
      • 部分应用参数
    • std::bind_back与其他绑定工具的对比
      • 与std::bind的对比
      • 与std::bind_front的对比
    • 总结

引言

在C++的发展历程中,每一个新标准的发布都会带来一些令人期待的新特性。C++23也不例外,其中std::bind_back就是一个非常实用的新特性。它是一种调用包装器,为开发者在处理函数调用和参数绑定时提供了更多的灵活性。本文将详细介绍std::bind_back的定义、功能、使用场景以及与其他相关工具的对比。

背景知识

在深入了解std::bind_back之前,我们需要先了解一些相关的背景知识。在C++中,函数对象和可调用对象是非常重要的概念。函数对象是重载了()运算符的类的实例,而可调用对象则是可以像函数一样被调用的对象,包括函数、函数指针、lambda表达式、bind对象等。

旧有的绑定工具

在C++11中引入了std::bind,它允许预设参数,创建新的函数对象。例如:

#include <functional>
#include <iostream>using namespace std::placeholders;double divMe(double a, double b) { return a / b; };int main()
{std::function<double(double, double)> myDiv1 = std::bind(divMe, _1, _2);std::function<double(double)> myDiv2 = std::bind(divMe, 2000, _1);std::cout << "myDiv1(1000, 5) = " << myDiv1(1000, 5) << std::endl; // 200std::cout << "myDiv2(10) = " << myDiv2(10) << std::endl; // 200return 0;
}

在这个例子中,std::bind将函数divMe与不同的参数进行绑定,创建了新的可调用对象。

C++20的std::bind_front

C++20引入了std::bind_front,它可以从可调用对象创建可调用包装器。调用std::bind_front(func, arg...)会将所有参数arg绑定到func的前面,并返回一个可调用包装器。例如:

std::function<double(double)> myDiv3 = std::bind_front(divMe, 2000);
std::cout << "myDiv3(5) = " << myDiv3(5) << std::endl; // 400

这里std::bind_front将参数2000绑定到divMe的前面,调用myDiv3(5)时相当于调用divMe(2000, 5)

std::bind_back的定义和功能

定义

std::bind_back是C++23中引入的一个函数模板,在标头<functional>中定义。其原型如下:

template < class F, class ... Args >
constexpr /*unspecified*/ bind_back( F&& f, Args&&... args );

它为f生成转发调用包装。调用此包装等价于绑定尾sizeof...(Args)个参数到args再调用f。换言之,std::bind_back (f, bound_args...) (call_args...) 等价于 std::invoke( f, call_args..., bound_args...)

功能

std::bind_back的主要功能是将参数绑定到可调用对象的后面,创建一个新的可调用包装器。这使得在某些场景下,我们可以更方便地处理函数调用和参数传递。例如:

std::function<double(double)> myDiv4 = std::bind_back(divMe, 10);
std::cout << "myDiv4(2000) = " << myDiv4(2000) << std::endl; // 200

在这个例子中,std::bind_back将参数10绑定到divMe的后面,调用myDiv4(2000)时相当于调用divMe(2000, 10)

std::bind_back的使用场景

简化回调函数

在很多异步编程场景下,常常需要传递一个不带参数的回调函数。std::bind_back可以让你将带参数的函数转换为无参数的形式,非常适合线程池、std::function<void()>回调等场景。例如:

#include <iostream>
#include <thread>
#include <functional>void task(int x, int y) {std::cout << "Task with values: " << x << " and " << y << std::endl;
}int main() {auto bound_task = std::bind_back(task, 42);std::thread t([&]() { bound_task(10); });t.join();return 0;
}

在这个例子中,std::bind_back将参数42绑定到task的后面,创建了一个新的可调用对象bound_task。然后将其封装在lambda表达式中传递给线程,调用时只需要提供剩余的参数10

部分应用参数

std::bind_back主要用于部分应用函数的参数。也就是说,您可以用std::bind_back预先绑定函数的一部分参数,然后在之后的调用中只提供其余参数。这使得代码更加灵活和模块化,尤其是当需要在不同的上下文中使用相同的函数但具有不同的部分参数时。例如:

#include <iostream>
#include <functional>int add(int a, int b, int c) {return a + b + c;
}int main() {auto partial_add = std::bind_back(add, 3, 4);std::cout << partial_add(2) << std::endl; // 9return 0;
}

在这个例子中,std::bind_back将参数34绑定到add的后面,创建了一个新的可调用对象partial_add。调用partial_add(2)时相当于调用add(2, 3, 4)

std::bind_back与其他绑定工具的对比

与std::bind的对比

  • 灵活性std::bind可以将参数绑定到任意位置,还可以改变参数的顺序,引入占位符等。而std::bind_back只能将参数绑定到可调用对象的后面。
  • 可读性std::bind的使用可能会导致代码变得晦涩难懂,尤其是在使用占位符时。而std::bind_back的语义更加明确,代码可读性更高。

与std::bind_front的对比

  • 绑定位置std::bind_front将参数绑定到可调用对象的前面,而std::bind_back将参数绑定到可调用对象的后面。这使得它们在不同的场景下有不同的用途。
  • 使用场景:当需要将参数绑定到前面时,使用std::bind_front;当需要将参数绑定到后面时,使用std::bind_back

总结

std::bind_back是C++23中一个非常实用的新特性,它为开发者在处理函数调用和参数绑定时提供了更多的灵活性。通过将参数绑定到可调用对象的后面,std::bind_back可以简化回调函数、部分应用参数等。与std::bindstd::bind_front相比,它具有自己独特的优势和适用场景。在实际开发中,我们可以根据具体的需求选择合适的绑定工具。

相关文章:

C++23 std::bind_back:一种调用包装器 (P2387R3)

文章目录 引言背景知识旧有的绑定工具C20的std::bind_front std::bind_back的定义和功能定义功能 std::bind_back的使用场景简化回调函数部分应用参数 std::bind_back与其他绑定工具的对比与std::bind的对比与std::bind_front的对比 总结 引言 在C的发展历程中&#xff0c;每一…...

使用多线程快速向Excel中快速插入一万条数据案例

当有大量数据需要存入Excel时&#xff0c;使用传统的单线程完成会有以下这些弊端&#xff1a; 导入速度慢&#xff1a;单线程一次只能处理一个任务&#xff0c;在导入大量数据时&#xff0c;需要逐个将数据写入 Excel。这意味着 CPU 在大部分时间里只能处理一个数据块&#xff…...

RestRequest ,newtonsoft解析

var request new RestRequest(Method.GET); IRestResponse response client.Execute(request); Console.WriteLine(response.Content); //保存token Newtonsoft.Json.Linq.JObject obj3 Newtonsoft.Json.Linq.JObject.Pars…...

vs2022解决 此项目需要MFC库。从visual studio安装程序(单个组件选项卡)为正在使用的任何工具和体系结构安装他们问题

使用visual studio 2022创建MFC 单文档的项目&#xff0c;编译器报错&#xff1a; 严重性 代码 说明 项目 文件 行 禁止显示状态 详细信息 错误 MSB8041 此项目需要 MFC 库。从 Visual Studio 安装程序(单个组件选项卡)为正在使用的任何工具集和体系结构安装它们。 osgEarthMFC…...

面试算法高频08-动态规划-03

练习题 题目描述 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间相邻的房屋在同一晚上被小偷闯入&#xff0c;系统会自动报警。 给定一个代表每…...

uniapp做app,使用v-for遍历渲染第二层的时候,打包到手机上渲染不出第二层的数据

1.打包apk要严格注意一点&#xff0c;在data中定义的时候要把第二层定义上&#xff0c; pointspower: [{ jcdbh: 1, cgqbhs:[] }] 不然会出现未定义的情况&#xff0c;直接把二层结构定义上&#xff0c;有利无害 2.渲染…...

Uniapp(vue):生命周期

目录 一、Vue生命周期二、Uniapp中页面的生命周期三、执行顺序比较一、Vue生命周期 setup():是在beforeCreate和created之前运行的,所以可以用setup代替这两个钩子函数。onBeforeMount():已经完成了模板的编译,但是组件还未挂载到DOM上的函数。onMounted():组件挂载到DOM完…...

Git技巧:Git Hook,自动触发,含实战分享

Git技巧&#xff1a;Git Hook&#xff0c;自动触发&#xff0c;含实战分享 最近项目需要1个git合入时触发脚本的功能&#xff0c;使用Git Hook功能实现&#xff0c;总结如下&#xff1a; Git项目在路径&#xff1a;repo\.git\hooks下有很多文件&#xff0c;这些文件就是本地钩…...

DeepSeek创始人梁文峰是个什么样的人?

梁文峰是一位在人工智能领域具有深远影响力的企业家和技术创新者&#xff0c;他的个人经历和成就展现了他作为一位技术天才、创新领袖以及社会责任感强的企业家的多重身份。 从学术背景来看&#xff0c;梁文峰出生于广东湛江吴川&#xff0c;17岁时以高考状元的身份考入浙江大…...

【知识科普】今天聊聊CDN

CDN 技术详解&#xff1a;从原理到配置实践 CDN 技术详解&#xff1a;从原理到配置实践一、CDN 核心定义二、工作原理深度解析1. 请求路由机制2. 缓存分层架构3. 内容更新流程 三、核心功能组件1. 基础设施层2. 软件系统 四、典型配置流程&#xff08;以Cloudflare为例&#xf…...

Axure疑难杂症:利用中继器制作三级下拉菜单(逻辑判断进阶)

亲爱的小伙伴,在您浏览之前,烦请关注一下,在此深表感谢! Axure产品经理精品视频课已登录CSDN可点击学习https://edu.csdn.net/course/detail/40420 课程主题:三级下拉菜单 主要内容:条件筛选时的逻辑判断思维,中继器使用 应用场景:复合条件下的下拉列表制作 案例展…...

C语言----操作符详解(万字详解)

目录 1. 操作符的分类 2. 二进制和进制转换 3. 原码 反码 补码 4. 移位操作符 4.1 左移操作符 >> 4.2 右移操作符 >> 5. 位操作符 5.1 按位与 & 5.2 按位或 | 5.3 按位异或 ^ 5.4 按位取反 ~ 练习 整数存储在内存中二进制中1的个数 练习 二进制位…...

docker本地部署ClipCascade,实现跨设备剪贴板同步

1、什么是 ClipCascade &#xff1f; ClipCascade 是一款开源的轻量级工具&#xff0c;可以自动同步您的剪贴板在多个设备之间&#xff0c;无需按键。它确保设备之间无缝的剪贴板共享&#xff0c;并以端对端加密优先保护隐私。无论您是在不同工作站之间切换&#xff0c;还是仅…...

Android Compose vs 传统View系统:全面对比与选型指南

Android Compose vs 传统View系统&#xff1a;全面对比与选型指南 一、引言 随着Android Jetpack Compose的正式发布&#xff0c;Android开发迎来了全新的声明式UI框架。本文将全面对比Compose与传统View系统的差异&#xff0c;帮助开发者做出合理的技术选型。 二、核心架构…...

CVE-2024-3431 EyouCMS 反序列化漏洞研究分析

易优内容管理系统(EyouCms) 隶属于海口快推科技有限公司&#xff0c;专注中小型企业信息传播解决方案&#xff0c;利用网络传递信息在一定程度上提高了办事的效率&#xff0c;提高企业的竞争力。EyouCms 是一个自由和开放源码的内容管理系统&#xff0c;它是一个可以独立使用的…...

C# wpf

学习网址&#xff1a;控件的父类们 - WPF中文网 - 从小白到大佬 控件的父类&#xff1a; 由此我们可以得出结论&#xff0c;控件的父类们(准确的说&#xff0c;应该叫父类的父类的父类)&#xff0c;至少有如下几个类型&#xff1a; DispatcherObjectDependencyObjectVisualU…...

十一、引用与拷贝函数(References the Copy-Constructor)

十一、引用与拷贝函数&#xff08;References & the Copy-Constructor&#xff09; 11.1 指针回顾&#xff08;Review of pointers&#xff09; 指针可以保存一个地址。 当你定义一个指针时&#xff0c;必须指定它所指向变量的类型&#xff0c;并且应该初始化它。 示例&a…...

数据结构之顺序表

目录 1.线性表 1.1 线性表的定义&#xff1a;零个或多个数据元素的有限序列。 1.2深度解析 1.3 线性表的抽象数据类型 2.顺序表 2.1 顺序表的定义和存储方式 2.2静态顺序表 2.2.1 静态顺序表的使用 2.2.3 为什么我们要使用typedef呢&#xff1f; 2.2.4 为什么我们要使…...

【计算机视觉】三种图像质量评价指标详解:PSNR、SSIM与SAM

图像质量评价指标详解&#xff1a;PSNR、SSIM与SAM 文章目录 图像质量评价指标详解&#xff1a;PSNR、SSIM与SAM1. 峰值信噪比(PSNR)1.1 数学定义1.2 特点与局限性 2. 结构相似性指数(SSIM)2.1 数学定义2.2 特点与应用 3. 光谱角度映射器(SAM)3.1 数学定义3.2 特点与应用 4. Py…...

轻舟系列FPGA加速卡:大模型分布式训练中的高效协同者

在超大规模模型&#xff08;如千亿级参数&#xff09;的分布式训练中&#xff0c;计算、存储与通信的协同优化是突破性能瓶颈的关键。绿算技术公司的轻舟系列FPGA加速卡凭借其低延迟、高能效和可编程特性&#xff0c;能够成为分布式训练架构中的异构加速节点。其在训练集群中的…...

C++20 小语法

这个提案允许在static_assert和if constexpr中从整形转换为布尔类型。 以下表格就可以表示所有内容。 对于严格的C 编译器来说&#xff0c;以前在这种情境下int无法向下转换为bool&#xff0c;需要手动强制转换&#xff0c; C23 这一情况得到了改善。 对于严格的C编译器来说&a…...

LM393比较器的比较翻转电压不对

问个问题&#xff0c;用的LM393比较器&#xff0c;3.3V供电&#xff0c;比较器输出上拉到3.3V&#xff0c; V给的基准2.8V&#xff0c;V-电压从1V升到2.3V&#xff0c;比较器就输出0V了&#xff0c;按理论超过2.8V才翻转到0V的 根据问题描述和电路分析&#xff0c;比较器LM393…...

解决 shadui组件库Popover 点击后会消失

react用了shadui组件库 <Popover><PopoverTrigger><div className"text-operation-item" onClick{props.callback}><img src{props.imgSrc} width{20} height{20} /></div></PopoverTrigger><PopoverContent className"…...

国联股份卫多多与北京慧闻科技(集团)签署战略合作协议

4月27日&#xff0c;北京慧闻科技&#xff08;集团&#xff09;有限公司&#xff08;以下简称“慧闻科技”&#xff09;销售总监王兴卓一行到访国联股份卫多多&#xff0c;同卫多多/纸多多副总裁、产发部总经理段任飞&#xff0c;卫多多机器人产业链总经理桂林展开深入交流&…...

从数据到决策:如何使用Python进行自动驾驶数据分析

从数据到决策:如何使用Python进行自动驾驶数据分析 大家好,我是Echo_Wish,今天来和大家聊一聊在自动驾驶领域中,如何通过Python进行数据分析。随着自动驾驶技术的不断发展,数据分析在这一领域的作用越来越重要。从传感器数据的处理到模型的训练和优化,Python在自动驾驶数…...

IIS服务器提示ERR_HTTP2 PROTOCOL ERROR解决方案

今天我的淘宝店来了一个客户&#xff0c;说小程序苹果访问没问题&#xff0c;安卓系统访问出现ERR HTTP2 PROTOCAL ERROR的错误见下图 方法供大家闭坑步骤&#xff1a;通过注册表修改(高级) 打开注册表编辑器 (regedit) 导航到&#xff1a; HKEY_LOCAL_MACHINE\SYSTEM\Current…...

Django的异步任务队列管理_Celery

1 基本原理 Celery 是一个异步任务队列&#xff0c;能够将耗时操作&#xff08;如发邮件、处理图片、网络爬虫等&#xff09;从 Django 主线程中分离出来&#xff0c;由后台的 worker 处理&#xff0c;避免阻塞请求。Celery 作为独立运行的后台进程&#xff08;Worker&#xf…...

Ubuntu18.04安装IntelliJ IDEA2025步骤

1.下载linux版本的idea 复制下面链接到虚拟机浏览器 下载 IntelliJ IDEA 下载好后&#xff0c;你的文件里会多一个文件&#xff0c;如下图 2.解压并运行Idea 2.1在/usr/local/路径下新建安装目录IDEA&#xff1a; 打开终端输入以下命令&#xff1a; sudo mkdir -p /usr/loc…...

LLM - Large Language Model

回顾2024&#xff1a;与LLM又相伴一年的经历与思考 - 知乎万字长文入门大语言模型&#xff08;LLM&#xff09; - 知乎“大模型本质就是两个文件&#xff01;”特斯拉前AI总监爆火LLM科普&#xff0c;时长1小时&#xff0c;面向普通大众 - 知乎大模型本质及趋势剖析&#xff0c…...

解决Ubuntu20.04重启出现显卡驱动异常的问题(操作记录)

一、问题情况 电脑异常断电&#xff0c;重启后&#xff0c;显示界面异常&#xff0c;显卡驱动已丢失。 二、操作流程 1、查看安装显卡驱动 ls /usr/src | grep nvidia 记住该驱动&#xff0c;我的是nvidia-550.127.05 2、安装dkms&#xff08;如果没有&#xff09; sudo …...

23.开关电源干扰控制的EMC改善措施

开关电源干扰控制的EMC改善措施 1. 开关电源的EMI干扰机理2. 钳位抑制EMI3. 阻容吸收抑制EMI4. 波形整形抑制EMI 1. 开关电源的EMI干扰机理 2. 钳位抑制EMI 只能抑制Ts阶段。 3. 阻容吸收抑制EMI 4. 波形整形抑制EMI...

新能源汽车声纹监测技术的发展趋势是什么?

新能源汽车声纹监测技术有以下发展趋势&#xff1a; 智能化与自动化程度不断提高 故障自动诊断与预警&#xff1a;未来声纹监测系统将能够更加准确地自动识别和分析新能源汽车各部件的声纹特征变化&#xff0c;不仅能检测出故障&#xff0c;还能对故障的发展趋势进行预测&…...

如何获取按关键字搜索京东商品详情(代码示例)

在电商领域&#xff0c;获取京东商品的详细信息对于市场分析、选品上架、库存管理和价格策略制定等方面至关重要。京东作为国内知名的电商平台&#xff0c;提供了丰富的商品资源。通过 Python 爬虫技术&#xff0c;我们可以高效地获取京东商品的详细信息&#xff0c;包括商品名…...

C#中构造器及属性的加载顺序

一.基本原则: 先加载静态构造函数和静态字段,后加载普通构造函数和普通字段;先加载基类再加载子类; 二.具体的加载顺序: 父类静态字段--->父类静态构造函数--->子类静态字段--->子类静态构造函数--->父类实例字段---> 父类实例构造函数--->子类实例字段-…...

vue项目中如何使用markdown编辑器

在开发中,编辑markdown和回显markdown都是常见的需求。在vue(2.x和3.x都可以)中可以使用mavon-editor这个第三方依赖包。示例很简单易懂。 安装 npm install mavon-editor 注册 在main.js中注册这个组件 import Vue from vue import mavonEditor from mavon-editor impor…...

Python爬虫(9)Python数据存储实战:基于pymysql的MySQL数据库操作详解

目录 一、背景与核心价值二、pymysql核心操作详解2.1 环境准备2.2 数据库连接与基础操作2.3 事务处理与错误回滚2.4 高级功能&#xff1a;批量插入与性能优化 三、pymysql进阶技巧3.1 连接池管理&#xff08;推荐使用DBUtils&#xff09;3.2 SQL注入防御3.3 与ORM框架对比 四、…...

WPF之Button控件详解

文章目录 1. 引言2. Button控件基础Button类定义 3. Button控件的核心属性3.1 Content属性3.2 IsDefault属性3.3 IsCancel属性3.4 其他常用属性 4. 按钮样式与模板自定义4.1 简单样式设置4.2 使用Style对象4.3 触发器使用4.4 使用ControlTemplate完全自定义4.5 按钮视觉状态 5.…...

如何查看电脑电池使用情况

第一步打开cmd&#xff1a; 在键盘上按下winr 或者在搜索框中输入cmd 点击命令提示符 进入命令框 第二步输入命令&#xff1a; powercfg/batteryreport 出现如下情况 第三部找到对应电池报告进行查看&#xff1a; 在对应路径下找到电池报告 点击battery-report.html 到此…...

软考-软件设计师中级备考 6、数据结构 图

1. 有向图 有向图是由顶点集合 V 和有向边集合 E 组成的图结构。在有向图中&#xff0c;边是有方向的&#xff0c;即从一个顶点指向另一个顶点&#xff0c;通常用有序对 (u, v) 表示&#xff0c;其中 u 是边的起始顶点&#xff0c;v 是边的终止顶点。例如&#xff0c;在一个表…...

Label Studio 软件介绍及安装使用说明

背景说明 在做AI项目建模的时候&#xff0c;往往需要数据标注工作&#xff0c;比较常用的数据标注软件是Labeling或者Labelme,这两个都是离线的单独标注软件&#xff0c;使用起来是比较方便的&#xff0c;也是入门级学者比较适合的软件&#xff0c;然而有时候我们数据标注的数据…...

Azure 数字孪生是什么?

“Azure 数字孪生”是一项平台即服务 (PaaS) 产品/服务&#xff0c;它能够创建基于整个环境的数字模型的孪生图&#xff0c;这些图可能是建筑物、工厂、农场、能源网络、铁路、体育场馆&#xff0c;甚至整个城市。 这些数字模型可用于获取洞察力&#xff0c;以推动产品改进、运…...

界面控件DevExpress WPF v25.1预览 - AI功能增强(语义搜索)

DevExpress WPF拥有120个控件和库&#xff0c;将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序&#xff0c;这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 无论是Office办公软件…...

【神经网络与深度学习】五折交叉验证(5-Fold Cross-Validation)

引言 五折交叉验证&#xff08;5-Fold Cross-Validation&#xff09;是一种广泛应用于机器学习模型性能评估的技术&#xff0c;通过多次实验确保模型的评估结果更加稳定、可靠&#xff0c;同时最大限度地利用有限的数据资源。它将数据分成若干子集&#xff0c;交替作为训练集和…...

Linux权限概念讲解

1. 用户类型 1.1 用户分类 在Linux里面用户分为两类&#xff0c;一种是超级用户&#xff08;root&#xff09;&#xff0c;一种是普通用户。 超级用户只有一个&#xff0c;而普通用户可以有很多个。 如果我们在root用户状态下想要变成普通用户&#xff0c;我们可以使用命令…...

网络安全零基础培训 L1-8 PHP基础语法

文章目录 1 认识PHP1.1 PHP简介1.2 主要的特点1.3 跨平台性1.4 与数据库的良好集成1.5 开源和社区支持1.6 应用场景1.6.1 网站开发1.6.2 内容的管理程序1.6.3 Web应用程序开发1.6.4 为什么学习了解PHP 2 PHP的基础语法2.1 创建第一个PHP程序2.2 如何写注释2.3 PHP的变量2.4 PHP…...

鸿蒙 长列表加载性能优化

长列表加载性能优化 针对长列表加载这一场景&#xff0c;对列表渲染时间、页面滑动帧率、应用内存占用等方面带来优化&#xff0c;提升性能和用户体验的手段有如下 4 种&#xff1a; 懒加载&#xff1a;提供列表数据按需加载能力&#xff0c;解决一次性加载长列表数据耗时长、…...

第十二届蓝桥杯 2021 C/C++组 卡片

目录 题目&#xff1a; 题目描述&#xff1a; 题目链接&#xff1a; 思路&#xff1a; 思路详解&#xff1a; 代码&#xff1a; 代码详解&#xff1a; 题目&#xff1a; 题目描述&#xff1a; 题目链接&#xff1a; 卡片 - 蓝桥云课 思路&#xff1a; 思路详解&#…...

vscode 使用gitcode团队管理项目

1、下载安装vscode https://code.visualstudio.com/Download 2、安装git 3、在vscode中安装GitLens插件 4、打开终端 点击会显示当前更改的项目 5、提交更改的文件&#xff0c;会提示输入用户名、密码&#xff0c;这里的密码即是令牌&#xff0c;令牌在第一次创建的时候显…...

uniapp+vue3+ts 使用canvas实现安卓端、ios端及微信小程序端二维码生成及下载

加粗样式uniapp多端生成带二维码海报并保存至相册的实现 在微信小程序开发中&#xff0c;我们常常会遇到生成带有二维码的海报并保存到手机相册的需求&#xff0c;比如分享活动海报、产品宣传海报等。今天就来和大家分享一下如何通过代码实现这一功能。 准备工作 在开始之前&am…...

vue mixin混入与hook

mixin混入是 ‌选项式 API‌&#xff0c;在vue3-Composition API <script setup> 中无法直接使用&#xff0c;需通过 setup() 函数转换 vue2、vue3选项式API: // mixins/mixin.js export const mixin {methods: {courseType(courseLevel) {const levelMap {1: 初级,…...