记录模板学习(持续更新)
目的:
学习C++模板的编写,使用模板类包装一个可调用对象
可调用对象包括:普通函数, lambda表达式, 类成员函数
可以参考到QtConcurrent::run
的实现,可以看到这个函数有非常多重载,其中可以接受类成员函数的重载如下(截图仅能展示部分):
个人认为,这里的实现不是很好;这里是针对不同参数个数的函数,每一个都做一个重载,如果能实现一种方式,可以适配任意类型和数量的参数就好了
class AsyncTask
{
public:AsyncTask();// 支持可调用对象template <typename Functor, typename ...Args>static QFuture<std::result_of_t<Functor(Args...)>> postTask(Functor&& func, Args&& ...args){return QtConcurrent::run(std::forward<Functor>(func), std::forward<Args>(args)...);}// 支持类成员函数template <typename Class, typename ReturnType, typename... Args>static QFuture<ReturnType> postTask(Class* instance, ReturnType(Class::*memFunc)(Args...), Args&&... args){return QtConcurrent::run(instance, memFunc, std::forward<Args>(args)...);}
};
使用:
class A
{
public:int memFunc(double y, int x){qDebug() << "class member func:" << y << x << QThread::currentThreadId();return x;}
};int normalFunc(int x)
{qDebug() << "normal function:" << x << QThread::currentThreadId();return x;
}int main(int argc, char *argv[])
{QFuture<bool> future = AsyncTask::postTask([](int x, int y){qDebug() << "lambda:" << x << y << QThread::currentThreadId();return x < y;}, 3, 2); //绑定lambda表达式QFuture<int> future2 = AsyncTask::postTask(normalFunc, 5); //绑定普通函数A x;QFuture<int> future3 = AsyncTask::postTask(&x, &A::memFunc, 2.5, 3); //绑定类成员函数}
使用模板类包装类成员函数
// 模板类,用于包装类成员函数指针
template <typename Class, typename RetType, typename ...Args>
class MemberFunctionPointer
{
public:using MemFuncPtr = RetType(Class::*)(Args...); //类成员函数指针MemberFunctionPointer(MemFuncPtr ptr, Class* obj): m_ptr(ptr), object(obj){}RetType invoke(Args&&... args){return (object->*m_ptr)(std:: forward<Args>(args)...);}
private:MemFuncPtr m_ptr;Class* object;
};// 辅助函数,用于模板参数推导
// C++17之前, 模板类的模板参数不能自动推导,必须显示指出, 例如std::vector<int>; std::list<int>; 而模板函数的模板参数可以自动推导, 所以标准库才提供 std::make_pair的函数,减轻模板类的编码负担
template <typename Class, typename RetType, typename... Args>
MemberFunctionPointer<Class, RetType, Args...> make_wrapper(RetType (Class::*fn)(Args...), Class* object)
{return MemberFunctionPointer<Class, RetType, Args...>(fn, object);
}
使用:
auto wrapper = make_wrapper(&A::memFunc, &x);wrapper.invoke(3.2, 8);
参考
相关文章:

记录模板学习(持续更新)
目的: 学习C模板的编写,使用模板类包装一个可调用对象 可调用对象包括:普通函数, lambda表达式, 类成员函数 可以参考到QtConcurrent::run的实现,可以看到这个函数有非常多重载,其中可以接受类…...

Android hid 数据传输(device 端 )
最近一直在处理hid 数据需求,简而言之就是两台设备直接可以通过usb 线互相传递数据。 项目架构 为什么Device 端要采用HID(人机接口设备)的方式发送和接收数据呢? 主要是速度快,举个例子,就是鼠标移动&am…...

MaxEnt模型在物种分布模拟中如何应用?R语言+MaxEnt模型融合物种分布模拟、参数优化方法、结果分析制图与论文写作
目录 第一章 以问题导入的方式,深入掌握原理基础 第二章 常用数据检索与R语言自动化下载及可视化方法 第三章 R语言数据清洗与特征变量筛选 第四章 基于ArcGIS、R数据处理与进阶 第五章 基于Maxent的物种分布建模与预测 第六章 基于R语言的模型参数优化 第七…...
第3章:文本样式 --[CSS零基础入门]
CSS(层叠样式表)允许你以多种方式定制文本的外观。以下是一些常用的文本和字体相关的CSS属性: 1.字体 字体系列 当然,下面是两个使用不同字体系列的CSS示例。每个示例都展示了如何指定一个字体系列,并提供备用字体以确保在用户的系统中找不到首选字体时仍有合适的字体可…...
mysql 架构详解
MySQL的架构可以自顶向下分为多个层次,每个层次都有其特定的功能和组件。以下是对MySQL架构的详细解析: 一、整体架构概述 MySQL的整体架构包括MySQL Connectors(连接器)、MySQL Shell、连接层、服务层、存储引擎层和文件系统层…...
无代码探索AI大模型:腾讯云函数计算的卓越实践
在数字化转型的浪潮中,人工智能(AI)技术已经成为企业提升竞争力的关键。然而,对于许多业务人员来说,技术门槛高、开发周期长等问题限制了他们快速探索和应用AI大模型的能力。同时,对于缺乏GPU资源的开发者来…...
解决Ubuntu在VMware关机时,老是一个光标在那里闪动几分钟,才能关机的问题
把强制关机的等待时间缩短即可。 编辑 /etc/systemd/system.conf 文件 sudo gedit /etc/systemd/system.conf把 #DefaultTimeoutStartSec90s修改为 #DefaultTimeoutStartSec10s改完之后重载一下: sudo systemctl daemon-reload然后关机再试一下,这样…...

word poi-tl 图表功能增强,插入图表折线图、柱状图、饼状图
目录 问题解决问题poi-tl介绍 功能实现引入依赖功能介绍 功能实例饼图模版代码效果图 雷达图(模版同饼图)代码效果图 柱状图(模版同饼图)代码效果图 附加CustomCharts 工具类CustomChartSingleSeriesRenderData 数据对象CustomCha…...
常见网络钓鱼类型
网络钓鱼是一种网络攻击,是指具有恶意动机的攻击者伪装欺骗人们并收集用户名或密码等敏感信息的一系列行为。由于网络钓鱼涉及心理操纵并依赖于人为失误(而不是硬件或软件漏洞),因此被认定为是一种社会工程攻击。 1. 普通网络钓鱼(群攻&…...

数字图像处理考研考点(持续更新)
一、数字图像基本概念 1、人眼视觉特性 (1)眼睛上有两类光感受器:锥状体和杆状体 锥状体(锥细胞):约 700 万个,对颜色高度敏感,每个锥状体都连接到神经末梢,人可以充分地分辨图像细节。锥细胞…...

Spring Cloud Alibaba:一站式微服务解决方案
Spring Cloud Alibaba介绍 在当今的软件开发领域,微服务架构因其灵活性、可扩展性和独立性等优势而备受青睐。Spring Cloud Alibaba 作为一款强大的一站式微服务解决方案,为开发者提供了丰富的工具和组件,帮助他们轻松构建和管理复杂的微服务…...
ubuntu16.04部署dify教程
文章目录 1、克隆 Dify 源代码至本地环境2、加速Dify镜像文件下载3、启动 Dify4、访问 Dify5、更新 Dify6、常见问题及解决方案(1)容器restarting(2)日志文件上限(3)重置管理员密码(4࿰…...

JavaWeb文件上传
文件上传总览 文件上传主要是指将本地文件(包括但不限于图片、视频、音频等)上传到服务器,提供其他用户浏览或下载的过程。在日常生活中,我们在很多情况下都需要使用文件上传功能,比如:发微博、发朋友圈等…...

软件工程——期末复习(3)
一、题目类(老师重点提到过的题目) 1、高可靠性是否意味着高可用性?试举例证明自己的观点? 答:高可靠性不意味着高可用性 可靠性说明系统已经准备好,马上可以使用;可用性是系统可以无故障的持续运行,是一…...
apache的BeanUtils的Converter被相互污染覆盖问题
问题描述 apache的BeanUtils工具集中用来把map对象转换为java对象的BeanUtils#populate方法会因为单例的原因其转换器Converter被相互污染覆盖问题 maven依赖 <dependency><groupId>commons-beanutils</groupId><artifactId>commons-beanutils</…...

TCP的“可靠性”(上)
目录 TCP的“可靠性”(上)确认应答(可靠性传输的基础)超时重传连接管理(三次握手,四次挥手) TCP的“可靠性”(上) 想必大家都或多或少的听说过TCP的特性:有连…...

超标量处理器设计笔记(5)虚拟存储器、地址转换、page fault
虚拟存储器 概述地址转换单级页表多级页表案例最好情况:虚拟地址是连续的最差情况:每个第二级 PT 都装有一项 增加级数 Page Fault 程序保护 概述 当程序比物理内存空间更大时,无法全部装在物理内存中,需要对程序进行切片 虚拟…...

SparkSQL 读写数据攻略:从基础到实战
目录 一、输入Source 1)代码演示最普通的文件读取方式: 2) 通过jdbc读取数据库数据 3) 读取table中的数据【hive】 二、输出Sink 实战一:保存普通格式 实战二:保存到数据库中 实战三:将结果保存在h…...
react 使用状态管理调用列表接口渲染列表(包含条件查询,统一使用查询按钮,重置功能),避免重复多次调用接口的方法
react开发调用api接口一般使用useEffect来监听值的变化,通过值的变化与否来进行接口调用。 比如我们要进行一个查询接口 const [pageParams, setPage] useState({name: ,id: ,});const [dataList, setDataList] useState([]);const getList async () > {const…...

Stable Audio Open模型部署教程:用AI打造独家节拍,让声音焕发新活力!
Stable Audio Open 是一个开源的文本到音频模型,允许用户从简单的文本提示中生成长达 47 秒的高质量音频数据。该模型非常适合创建鼓点、乐器即兴演奏、环境声音、拟音录音和其他用于音乐制作和声音设计的音频样本。用户还可以根据他们的自定义音频数据微调模型&…...

深入剖析AI大模型:大模型时代的 Prompt 工程全解析
今天聊的内容,我认为是AI开发里面非常重要的内容。它在AI开发里无处不在,当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗",或者让翻译模型 "将这段合同翻译成商务日语" 时,输入的这句话就是 Prompt。…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...
前端倒计时误差!
提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

Nuxt.js 中的路由配置详解
Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...
VTK如何让部分单位不可见
最近遇到一个需求,需要让一个vtkDataSet中的部分单元不可见,查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行,是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示,主要是最后一个参数,透明度…...
【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)
升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点,但无自动故障转移能力,Master宕机后需人工切换,期间消息可能无法读取。Slave仅存储数据,无法主动升级为Master响应请求ÿ…...

项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)
Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败,具体原因是客户端发送了密码认证请求,但Redis服务器未设置密码 1.为Redis设置密码(匹配客户端配置) 步骤: 1).修…...

初学 pytest 记录
安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...

从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践
作者:吴岐诗,杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言:融合数据湖与数仓的创新之路 在数字金融时代,数据已成为金融机构的核心竞争力。杭银消费金…...

针对药品仓库的效期管理问题,如何利用WMS系统“破局”
案例: 某医药分销企业,主要经营各类药品的批发与零售。由于药品的特殊性,效期管理至关重要,但该企业一直面临效期问题的困扰。在未使用WMS系统之前,其药品入库、存储、出库等环节的效期管理主要依赖人工记录与检查。库…...