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

C++23 std::move_only_function:一种仅可移动的可调用包装器 (P0288R9)

文章目录

    • 一、定义与基本概念
      • 1.1 定义
      • 1.2 基本概念
    • 二、特点
      • 2.1 仅可移动性
      • 2.2 支持多种限定符
      • 2.3 无`target_type`和`target`访问器
      • 2.4 强前置条件
    • 三、使用场景
      • 3.1 处理不可复制的可调用对象
      • 3.2 性能优化
      • 3.3 资源管理
    • 四、与其他可调用包装器的对比
      • 4.1 与`std::function`的对比
      • 4.2 与`std::function_ref`的对比
    • 五、总结

在C++的发展历程中,不断引入新的特性和工具来提升语言的性能和灵活性。C++23标准引入了 std::move_only_function,这是一种仅可移动的可调用包装器,为开发者处理不可复制的可调用对象提供了强大的支持。本文将详细介绍 std::move_only_function的定义、特点、使用场景以及与其他可调用包装器的对比。

一、定义与基本概念

1.1 定义

std::move_only_function是一个通用的多态函数包装器,定义于头文件<functional>中。它可以存储和调用任何可构造的(不要求是可移动构造的)可调用目标,包括函数、lambda表达式、bind表达式、其他函数对象,以及指向成员函数的指针和指向成员对象的指针。存储的可调用对象被称为std::move_only_function的目标。如果std::move_only_function不包含目标,则被称为空的。与std::function不同,调用空的std::move_only_function会导致未定义行为。

其模板定义如下:

// 主模板未定义
// template< class... >
// class move_only_function; // 各种特化版本
// template< class R, class... Args >
// class move_only_function< R( Args...)> ;
// template< class R, class... Args >
// class move_only_function< R( Args...) noexcept>;
// template< class R, class... Args >
// class move_only_function< R( Args...) &> ;
// template< class R, class... Args >
// class move_only_function< R( Args...) & noexcept>;
// template< class R, class... Args >
// class move_only_function< R( Args...) &&>;
// template< class R, class... Args >
// class move_only_function< R( Args...) && noexcept>;
// template< class R, class... Args >
// class move_only_function< R( Args...) const> ;
// template< class R, class... Args >
// class move_only_function< R( Args...) const noexcept>;
// template< class R, class... Args >
// class move_only_function< R( Args...) const &> ;
// template< class R, class... Args >
// class move_only_function< R( Args...) const & noexcept> ;
// template< class R, class... Args >
// class move_only_function< R( Args...) const &&>;
// template< class R, class... Args >
// class move_only_function< R( Args...) const && noexcept >;

1.2 基本概念

std::move_only_function满足MoveConstructibleMoveAssignable的要求,但不满足CopyConstructibleCopyAssignable。这意味着它只能通过移动操作进行构造和赋值,不能进行复制操作。这种设计使得std::move_only_function能够处理那些不可复制的可调用对象,例如捕获了std::unique_ptr的lambda表达式。

二、特点

2.1 仅可移动性

std::move_only_function的核心特点是仅可移动。这是为了处理那些不可复制的可调用对象而设计的。在C++中,有些对象由于其资源管理的特性(如std::unique_ptr)不能被复制,只能被移动。std::move_only_function允许我们将这些不可复制的可调用对象存储在一个包装器中,从而方便地进行传递和调用。

2.2 支持多种限定符

std::move_only_function支持模板参数中提供的每一种可能的cv限定符(不包括volatile)、引用限定符和noexcept说明符的组合。这些限定符和说明符(如果有的话)会被添加到其operator()中。这使得std::move_only_function能够精确地匹配不同类型的可调用对象,提供了更高的灵活性。

2.3 无target_typetarget访问器

std::function不同,std::move_only_function没有target_typetarget访问ors。这是根据用户和实现者的需求做出的设计决策。移除这些访问器可以简化实现,并避免一些潜在的问题。

2.4 强前置条件

调用std::move_only_function时具有强前置条件。如果std::move_only_function为空,则调用它会导致未定义行为。这要求开发者在调用之前确保std::move_only_function包含有效的目标。

三、使用场景

3.1 处理不可复制的可调用对象

当需要处理捕获了不可复制对象(如std::unique_ptr)的lambda表达式时,std::move_only_function是一个很好的选择。以下是一个示例:

#include <iostream>
#include <functional>
#include <memory>int main() {auto ptr = std::make_unique<int>(42);// 捕获std::unique_ptr的lambda表达式auto lambda = [ptr = std::move(ptr)]() {std::cout << *ptr << std::endl;};// 使用std::move_only_function存储lambda表达式std::move_only_function<void()> func = std::move(lambda);func(); // 调用存储的lambda表达式return 0;
}

在这个示例中,lambda表达式捕获了一个std::unique_ptr,由于std::unique_ptr是不可复制的,因此不能使用std::function来存储这个lambda表达式。而std::move_only_function可以通过移动操作来存储这个lambda表达式,从而实现对不可复制可调用对象的处理。

3.2 性能优化

在某些情况下,使用std::move_only_function可以避免不必要的复制操作,从而提高性能。例如,当需要将一个可调用对象从一个函数传递到另一个函数时,如果这个可调用对象是不可复制的,使用std::move_only_function可以通过移动操作来传递,避免了复制的开销。

3.3 资源管理

std::move_only_function可以用于管理资源的生命周期。例如,在一个函数中创建一个可调用对象,该对象持有一些资源(如文件句柄、网络连接等),并将其存储在std::move_only_function中。当std::move_only_function被销毁时,其持有的可调用对象也会被销毁,从而自动释放资源。

四、与其他可调用包装器的对比

4.1 与std::function的对比

  • 复制性std::function是可复制的,而std::move_only_function是仅可移动的。这意味着std::function可以存储和复制任何可复制的可调用对象,而std::move_only_function专门用于处理不可复制的可调用对象。
  • 性能:由于std::move_only_function避免了复制操作,在处理不可复制对象时可能具有更好的性能。而std::function在复制操作上可能会有一定的开销。
  • 功能完整性std::function具有target_typetarget访问ors,可以用于获取存储的可调用对象的类型和指针。而std::move_only_function没有这些访问ors,这使得它的实现更加简单,但也限制了一些功能。

4.2 与std::function_ref的对比

  • 所有权std::function_ref是一个轻量级的引用包装器,它不拥有可调用对象的所有权,只是对可调用对象的一个引用。而std::move_only_function拥有可调用对象的所有权,当std::move_only_function被销毁时,其持有的可调用对象也会被销毁。
  • 生命周期管理:由于std::function_ref只是一个引用,它要求被引用的可调用对象的生命周期必须长于std::function_ref本身。而std::move_only_function对可调用对象的生命周期有完全的控制权。
  • 可移动性std::function_ref是可复制的,而std::move_only_function是仅可移动的。这使得std::function_ref更适合作为函数参数传递,而std::move_only_function更适合用于存储和管理不可复制的可调用对象。

五、总结

std::move_only_function是C++23标准引入的一个重要特性,它为开发者提供了一种处理不可复制可调用对象的有效方式。通过其仅可移动的特性、对多种限定符的支持以及强前置条件等特点,std::move_only_function在处理复杂的可调用对象和优化性能方面具有很大的优势。在实际开发中,当需要处理不可复制的可调用对象时,不妨考虑使用std::move_only_function来提升代码的性能和灵活性。

相关文章:

C++23 std::move_only_function:一种仅可移动的可调用包装器 (P0288R9)

文章目录 一、定义与基本概念1.1 定义1.2 基本概念 二、特点2.1 仅可移动性2.2 支持多种限定符2.3 无target_type和target访问器2.4 强前置条件 三、使用场景3.1 处理不可复制的可调用对象3.2 性能优化3.3 资源管理 四、与其他可调用包装器的对比4.1 与std::function的对比4.2 …...

Zookeeper实现分布式锁实战应用

Zookeeper实现分布式锁实战应用示例 1. 分布式锁概述 在分布式系统中&#xff0c;当多个进程或服务需要互斥地访问共享资源时&#xff0c;就需要分布式锁来协调。Zookeeper因其强一致性和临时节点特性&#xff0c;非常适合实现分布式锁。 2. Zookeeper实现分布式锁的核心原理…...

使用 Playwright 构建高效爬虫:原理、实战与最佳实践

随着网站前端技术日益复杂,传统的基于请求解析(如 requests、BeautifulSoup)的爬虫在处理 JavaScript 渲染的网站时变得力不从心。Playwright,作为微软推出的一款强大的自动化浏览器控制框架,不仅适用于自动化测试,也成为了处理现代网站爬取任务的利器。 本篇文章将带你…...

ComfyUI for Windwos与 Stable Diffusion WebUI 模型共享修复

#工作记录 虽然在安装ComfyUI for Windwos时已经配置过extra_model_paths.yaml 文件&#xff0c;但升级ComfyUI for Windwos到最新版本后发现原先的模型配置失效了&#xff0c;排查后发现&#xff0c;原来是 extra_model_paths.yaml 文件在新版本中被移动到了C盘目录下&#x…...

【RabbitMQ消息队列】详解(一)

初识RabbitMQ RabbitMQ 是一个开源的消息代理软件&#xff0c;也被称为消息队列中间件&#xff0c;它遵循 AMQP&#xff08;高级消息队列协议&#xff09;&#xff0c;并且支持多种其他消息协议。 核心概念 生产者&#xff08;Producer&#xff09;&#xff1a;创建消息并将其…...

【MySQL数据库入门到精通-08 约束】

文章目录 4、约束4.1 概述4.2 约束演示1. 根据需求&#xff0c;完成表的创建2. SQL数据库3. 结果 4.3 外键约束4.3.1 介绍1. 根据需求&#xff0c;完成表的创建2. SQL数据库3. 结果4.3.2 外键约束建立1. 语法2. SQL语句3. 现象4.3.3 外键删除更新行为1. 知识点2.SQL3.结果 4、约…...

C++笔记-模板进阶和继承(上)

一.模板进阶 1.1非模板类型参数 那之前学过的stack举例&#xff0c;在这之前我们如果要用N&#xff0c;就要用宏来定义&#xff0c;但是宏毕竟有局限性&#xff1a; 如果我要用到两个stack&#xff0c;一个要求10个空间&#xff0c;另一个要求100空间呢&#xff1f; 这时候…...

云计算赋能质检LIMS的价值 质检LIMS系统在云计算企业的创新应用

在云计算技术高速发展的背景下&#xff0c;实验室信息化管理正经历深刻变革。质检LIMS&#xff08;实验室信息管理系统&#xff09;作为实验室数字化转型的核心工具&#xff0c;通过与云计算深度融合&#xff0c;为企业提供了高弹性、高安全性的解决方案。本文将探讨质检LIMS在…...

2025系统架构师---数据抽象(Data Abstraction)‌与‌面向对象架构风格

引言 在软件系统复杂度与规模不断攀升的今天&#xff0c;如何设计出可扩展、易维护且能快速响应需求变化的架构&#xff0c;是每一位系统架构师面临的挑战。‌数据抽象&#xff08;Data Abstraction&#xff09;‌与‌面向对象架构风格&#xff08;Object-Oriented Architectu…...

[python] 基于WatchDog库实现文件系统监控

Watchdog库是Python中一个用于监控文件系统变化的第三方库。它能够实时监测文件或目录的创建、修改、删除等操作&#xff0c;并在这些事件发生时触发相应的处理逻辑&#xff0c;因此也被称为文件看门狗。 Watchdog库的官方仓库见&#xff1a;watchdog&#xff0c;Watchdog库的官…...

缺省处理、容错处理

布尔判定 假&#xff1a;false 0 null undefined NaN 可选符.?和&#xff1f;&#xff1f; let obj {name: jim,data: {money: 0,age: 18,fn(a){return a}} }1、如果左侧的值为null或者undefined&#xff0c;则使用右侧值。需要使用"??" obj?.data?.a…...

Taro on Harmony :助力业务高效开发纯血鸿蒙应用

背景 纯血鸿蒙逐渐成为全球第三大操作系统&#xff0c;业界也掀起了适配鸿蒙原生的浪潮&#xff0c;用户迁移趋势明显&#xff0c;京东作为国民应用&#xff0c;为鸿蒙用户提供完整的购物体验至关重要。 &#xfeff; &#xfeff;&#xfeff; 去年 9 月&#xff0c;京东 AP…...

Java基础——排序算法

排序算法不管是考试、面试、还是日常开发中都是一个特别高频的点。下面对八种排序算法做简单的介绍。 1. 冒泡排序&#xff08;Bubble Sort&#xff09; 原理&#xff1a;相邻元素比较&#xff0c;每一轮将最大元素“冒泡”到末尾。 示例数组&#xff1a;[5, 3, 8, 1, 2] pub…...

【操作系统原理07】输入/输出系统

文章目录 零.大纲一.I/O设备的概念和分类0.大纲1.什么是I/O设备2.I/O分类 二.I/O控制器0.大纲1.I/O设备的电子部件&#xff08;I/O控制器&#xff09;2.IO控制器组成3.内存映像I/O VS 寄存器独立编址 三.I/O控制方式0.大纲与总结1.程序直接控制方式&#xff08;1&#xff09; 操…...

IM云端搜索全面升级,独家能力拓展更多“社交连接”玩法

在这个数字时代&#xff0c;网络让信息传递前所未有的便捷&#xff0c;但同时&#xff0c;海量数据堆积也让内容检索变得像大海捞针。尤其是在我们日常工作生活中最常用的即时通信软件中&#xff0c;信息的快速查找和精准定位正变得越来越重要。 但传统的本地搜索功能受限于设…...

汽车产业链主表及类别表设计

&#xff08;提前设计&#xff0c;备用&#xff09; 一、汽车产业链类别表&#xff08;industry_chain_category&#xff09; 设计要点 1、核心字段&#xff1a;定义产业链分类&#xff08;如零部件、整车制造、销售服务等&#xff09; 2、主键约束&#xff1a;自增ID作为唯一标…...

有效的字母异位词

recorded&#xff1a;用于统计或抵消字符出现次数。 class Solution { public:bool isAnagram(string s, string t) {int record[26]{0};for(int i0;i<s.size();i){record[s[i]-a];}for(int i0;i<t.size();i){record[t[i]-a]--;}for(int i0;i<26;i){if(record[i]!0){…...

汽车网络安全 -- 理解暴露面、攻击面和攻击向量

1.暴露面是攻击面的子集 举个例子&#xff0c;房子都有门、窗户&#xff0c;这些窗户、门不管是否打开&#xff0c;都可能被小偷利用进入到房内&#xff0c;因此这些门窗可能是潜在的漏洞&#xff0c;所以称之为攻击面(Attack Surface)。 小偷经过长期观察&#xff0c;发现家…...

C++异步利器:全面理解 std::packaged_task

在现代 C&#xff08;C11及以后&#xff09;中&#xff0c;并发与异步编程是不可回避的重要技能。我们常常希望把某些计算任务扔给后台线程去处理&#xff0c;同时又能优雅地获取任务结果。 这时候&#xff0c;std::packaged_task 就是一个非常强大的工具。 本文将带你深入理解…...

Animate 中HTMLCanvas 画布下的鼠标事件列表(DOM 鼠标)

在 JavaScript 和 ‌Adobe Animate&#xff08;CreateJS&#xff09;‌ 中&#xff0c;常用的鼠标交互事件可分为两大类&#xff1a;‌基础 DOM 事件‌ 和 ‌CreateJS 扩展事件‌12。以下是完整分类&#xff1a; 一、基础 DOM 鼠标事件 事件名触发场景冒泡特性click鼠标左键单…...

RagFlow文档切块提升

1.RagFlow切块介绍 2.复现优化 2.1 General 通用分块 def parser_text(self, txt, blockSize512, overlapSize0, delimiter"\n!?;。&#xff1b;&#xff01;&#xff1f;"):文本分割sentences self.split_text_by_period_qh(txt, delimiter, blockSizeblockSize)…...

音频转base64

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>音频转Base64</title><style>.containe…...

蓝桥杯 11. 打印大X

打印大X 原题目链接 题目描述 小明希望用星号拼凑&#xff0c;打印出一个大 X&#xff0c;他要求能够控制笔画的宽度和整个字的高度。 为了便于比对空格&#xff0c;所有的空白位置都以句点符 . 来代替。 输入描述 输入两个整数 m 和 n&#xff0c;表示笔画的宽度和 X 的高…...

页面需要重加载才能显示的问题修改

1.问题描述&#xff1a;跳转页面后&#xff0c;只有点击重新加载后才会显示内容 经过测试后&#xff1a; / 跳转详情 const goToDetail (bookId) > { router.push({ path: /classic-detail, query: { book_id: bookId } }) } 执行完以上代码后&#xff0c;页面从classics…...

On the Biology of a Large Language Model——Claude团队的模型理解文章【论文阅读笔记】其二——数学计算部分

这篇内容的源博文是 On the Biology of a Large Language Model 这是Anthropic&#xff0c;也就是Claude的团队的一遍技术博客。他的主要内容是用一种改良版的稀疏编码器来解释LLM在inference过程中内部语义特征的激活模式。因为原文太长&#xff0c;我把原文分成了几份来写阅读…...

Python语言基础知识详解:标识符与变量

Python语言基础知识详解&#xff1a;标识符与变量 一、标识符&#xff08;Identifiers&#xff09; 定义 标识符是用于命名变量、函数、类、模块或其他对象的名称。它是代码中对实体的唯一标识。 1. 标识符的命名规则 Python的标识符需遵循以下规则&#xff1a; 允许的字符 由…...

google chrome 中 fcitx5 候选框不跟随光标

我的电脑&#xff1a;ubuntu22.04&#xff0c;窗口系统&#xff1a;wayland 2025/4/26 号更新的谷歌浏览器 今天打开浏览器发现输入法的候选框固定在左上角不动了&#xff0c;一番折腾&#xff0c;发现解决办法如下&#xff1a; 在搜索框中输入 about:flags搜索 wayland&#…...

深入浅出提示词工程(结合 DeepSeek)

提示词工程 Prompt 即提示、指令&#xff0c;所以提示工程也叫「指令工程」 用户输入的问题称为 Prompt&#xff0c;本文主要探讨 System Prompt&#xff08;我将其翻译成「系统预设」&#xff09; 使用 Prompt 的目的 直接提问 如「我该学 Vue 还是 React&#xff1f;」&…...

OpenVLA:大语言模型用于机器人操控的经典开源作品

TL;DR 2024 年斯坦福大学提出的 OpenVLA&#xff0c;基于大语言模型实现机器人操控&#xff0c;代码完全开源。 Paper Notes Name&#xff1a;OpenVLA: An Open-Source Vision-Language-Action ModelURL&#xff1a;https://openvla.github.io/作者&#xff1a;斯坦福&#…...

数值分析、数值代数之追赶法

数值分析、数值代数之追赶法 MATLAB 中&#xff0c;diag 函数用法追赶法推导过程代码运行过程 MATLAB 中&#xff0c;diag 函数用法 在 MATLAB 中&#xff0c;diag 函数用于处理矩阵的对角线元素或创建对角矩阵。以下是其常见的用法&#xff1a; 1.提取矩阵的对角线元素 2.创…...

深入浅出JVM - Java架构师面试实战

深入浅出JVM - Java架构师面试实战 本文通过模拟一位拥有十年Java研发经验的资深架构师马架构与面试官之间的对话&#xff0c;深入探讨了JVM的核心知识点。涵盖内存结构、垃圾回收算法、垃圾回收器、内存调优工具及参数配置等关键领域。 第一轮提问 面试官&#xff1a; 马架…...

Qt网络数据解析方法总结

在Qt中解析网络数据通常涉及接收原始字节流&#xff0c;并将其转换为有意义的应用层数据。以下是详细步骤和示例&#xff1a; 1. 网络数据接收 使用QTcpSocket或QUdpSocket接收数据&#xff0c;通过readyRead()信号触发读取&#xff1a; // 创建TCP Socket并连接信号 QTcpSo…...

[AHOI2001] 质数和分解

import java.util.*;public class Main {static int[] ss new int[201];public static void main(String[] args) {Scanner sc new Scanner(System.in);while (sc.hasNextInt()) { int n sc.nextInt();int num 0; // 记录质数个数int[] dp new int[201];dp[0] 1;for (in…...

说一下Drop与delete区别

在数据库操作里&#xff0c;DROP与DELETE是两个重要且功能不同的命令&#xff0c;以下为你详细介绍二者的区别&#xff1a; 功能层面 DROP&#xff1a;此命令用于删除数据库、表、视图、索引等数据库对象。一旦执行&#xff0c;数据库对象就会被彻底删除&#xff0c;其定义和…...

基于云原生架构的后端微服务治理实战指南

一、引言&#xff1a;为什么在云原生时代更需要微服务治理&#xff1f; 在单体应用时代&#xff0c;开发和部署虽然简单&#xff0c;但随着系统规模的扩大&#xff0c;单体架构的维护成本急剧上升&#xff0c;部署频率受限&#xff0c;模块之间相互影响&#xff0c;最终导致系…...

后端响应巨量数据,如何优化性能?

WebSocket流式传输 fetch虚拟滚动 &#xff08;渲染性能提升&#xff0c;一次性记载固定条数&#xff09;分片滚动 fetch流式传输 async function streamData(url) {unction streamOutput(msg) {// 发送 POST 请求fetch(url, {method:"POST",body:JSON.stringify({ …...

《代码整洁之道》第4章 注释 - 笔记

注释的恰当用法是弥补代码表达意图时遭遇的失败&#xff0c;良好的代码&#xff0c;让读者看代码就能明白含义。 代码在变动&#xff0c;在演化。注释并不总是随之变动。不准确的注释比没有注释要坏的多。注释算的上是一种没办法去除的恶。 注释不能美化代码 与其花时间编写…...

闭包与装饰器(python)

此 Python 代码借助闭包构建了计算对数的函数。闭包指的是一个函数与其所引用的外部变量共同构成的一个整体。借助闭包&#xff0c;我们能够创建具有特定行为的函数&#xff0c;并且这些函数可以记住其创建时的环境。 代码详细分析 导入模块 python import math 导入 math …...

学成在线网页

技术&#xff1a;h5css&#xff0c;静态页面 主页&#xff1a; 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0&quo…...

AI测试工具Testim——告别自动化测试维护难题

随着人工智能技术的快速发展&#xff0c;AI测试工具正在成为提升软件研发效能的关键。每款AI的特性各有差异&#xff0c;今天&#xff0c;我们就给大家介绍一款专注于Web和移动应用的端到端的AI测试工具--Testim。 Testim的简介 官网地址&#xff1a;https://www.testim.io/ 简…...

【C++详解】C++入门(二)引用、内联函数、nullptr宏

文章目录 一、引用引用的概念和定义引用的功能引用的特性const引用const用法回顾权限的放大缩小const引用的功能 指针和引用的关系 二、内联函数三、nullptr补充结构体指针变量类型重定义 一、引用 引用的概念和定义 C祖师爷为了优化在部分场景中使用指针会出现的效率较低和比…...

8、HTTPD服务--CGI机制

目录 1、测试PHP页面 2、安装php软件 一、CGI机制介绍 1、测试PHP页面 [rootlocalhost ~]# cat /mp3/test1.php AAAAAAAAAAAAA <?phpphpinfo(); ?> 2、安装php软件 # yum install -y php # systemctl restart httpd php实际上是作为httpd的功能模块存在的 [r…...

层级时间轮的 Golang 实现原理与实践

一、引言 在高并发服务中&#xff0c;延时任务的管理是一个常见且重要的需求。比如 HTTP 请求超时、心跳检测、订单超时未支付提醒等场景&#xff0c;传统的 Timer 或 Heap 实现会带来 O(log n) 的复杂度&#xff0c;难以支撑百万级别的定时任务。 论文《Hashed and Hierarch…...

人类社会的第四阶段

本书的主旨是探讨一场新的权力革命&#xff0c;它将以20世纪民族国家的毁灭为代价&#xff0c; 解放出个体。创新&#xff0c;以前所未有的方式改变了暴力的逻辑&#xff0c;并且正在革新未来的 边界。如果我们的推论是正确的&#xff0c;你们正站在一场有史以来最宏大的革命的…...

Golang | Builder模式

Builder模式是一种创建型设计模式&#xff0c;用于分步骤构建复杂对象&#xff0c;尤其适用于构造过程复杂或需要多个配置选项的场景。将对象的构造过程与其表示分离&#xff0c;通过分步骤和链式调用的方式灵活创建对象&#xff0c;避免构造函数的参数爆炸&#xff0c;提升代码…...

C#本地使用离线ocr库识别图片中文本,工具包PaddleOCRSharp

C#本地使用离线ocr库识别图片文本&#xff0c;工具包PaddleOCRSharp PaddleOCRSharp介绍 项目地址&#xff1a;https://github.com/raoyutian/PaddleOCRSharp PaddleOCRSharp 是一个.NET版本OCR可离线使用类库。项目核心组件PaddleOCR.dll目前已经支持C\C、.NET、Python、Go…...

Flutter 在 Dart 3.8 开始支持 Null-Aware Elements 语法,自动识别集合里的空元素

近日&#xff0c;在 Dart 3.8 的 changelog 里正式提交了 Null-Aware Elements 语法&#xff0c;该语法糖可以用于在 List、Set、Map 等集合中处理可能为 null 的元素或键值对&#xff0c;简化显式检查 null 的场景&#xff1a; /之前 var listWithoutNullAwareElements [if …...

3、Linux操作系统下,linux的技术手册使用(man)

linux系统内置技术手册&#xff0c;方便开发人员查阅Linux相关指令&#xff0c;提升开发效率 man即是manual的前三个字母&#xff0c;有时候遇事不决&#xff0c;问个人&#xff08;man&#xff09; 其在线网址为&#xff1a;man 还有man网站的作者写的书&#xff0c;可以下…...

Python 自动化办公:Excel 数据处理的“秘密武器”

引言 在日常的 IT 办公场景里&#xff0c;Excel 是数据处理与分析的 “常胜将军”。无论是财务人员整理账目、销售团队统计业绩&#xff0c;还是运营人员分析用户数据&#xff0c;Excel 都发挥着关键作用。但面对海量数据&#xff0c;手动操作 Excel 不仅效率低下&#xff0c;还…...

通过数据增强打造抗噪音多模态大模型

下载前面 想象一下,你正在一个嘈杂的咖啡馆里,想让身边的AI助手帮你预定一张电影票。或者,你在熙熙攘攘的街道上,需要语音导航带你找到目的地。在这些真实的场景中,语音交互面临着一个巨大的挑战——噪音。 背景噪音、他人说话声、设备本身的电流声……这些无处不在的干…...