记录模板学习(持续更新)

news2025/1/2 4:28:36
目的:

学习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);

在这里插入图片描述


在这里插入图片描述

参考

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

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

相关文章

从0开始边做边学,用vue和python做一个博客,非规范化项目,怎么简单怎么弄,跑的起来有啥毛病解决啥毛病(三)

基础的内容都差不多了&#xff0c;开始研究文章详情页的内容设计&#xff0c;程序员嘛肯定要用markdown编辑了&#xff0c;找了一些发现这个md-editor看着还不错&#xff0c;文档介绍页比较清晰&#xff0c;用着也比较简单。 md-editor安装配置使用Mock.js模拟请求接口mock.js …

Android 逆向/反编译/Hook修改应用行为 基础实现

前言&#xff1a;本文通过一个简单的情景案例实现安卓逆向的基本操作 一、情景描述 本文通过一个简单的情景案例来实现安卓逆向的基本操作。在这个案例中所使用的项目程序是我自己的Demo程序&#xff0c;不会造成任何的财产侵害&#xff0c;本文仅作为日常记录及案例分享。实…

从0开始深度学习(35)——YOLO V5原理详解

以YOLO V5s为例&#xff0c;介绍YOLO V5的网络结构&#xff0c;以及其中具体的功能模块 1 YOLO V5的整体网络结构 YOLO V5网络结构分为四个部分&#xff1a; 输入端&#xff1a; 输入端负责对输入图像进行预处理&#xff0c;包括数据增强、锚框计算等。骨干网络&#xff08;Ba…

云计算vspere 安装过程

1 材料的准备 1 安装虚拟机 vmware workstation 2 安装esxi 主机 3 在esxi 主机上安装windows 2018 dns 服务器 4 在虚拟机上安装windows 2018 服务器 6 安装vcenter 5 登入界面测试 这里讲一下&#xff0c;由于部署vspere 需要在windows 2012 服务器上部…

微信小程序中使用miniprogram-sm-crypto实现SM4加密攻略

在微信小程序开发过程中&#xff0c;数据安全至关重要。本文将为大家介绍如何在微信小程序中使用miniprogram-sm-crypto插件进行SM4加密&#xff0c;确保数据传输的安全性。 一、SM4加密简介 SM4是一种对称加密算法&#xff0c;由国家密码管理局发布&#xff0c;适用于商密领…

算法-字符串-43.字符串相乘

一、题目 二、思路解析 1.思路&#xff1a; 1.双重for循环&#xff0c;倒序依次相乘 2.在倒序处理进位问题 3.最后返回参数的类型是string&#xff0c;用StringBuilder拼接&#xff0c;再转换为字符串 2.常用方法&#xff1a; 1.equals,比较对象内容是否一致 "0".eq…

vscode鼠标右键跳转到定义只能跳转到头文件

在使用Visual Studio Code进行C语言编程开发时&#xff0c;C/C插件出错&#xff0c;鼠标右键只能跳转到头文件&#xff0c;不能跳转到源代码中函数原型定义的地方。 解决办法 打开C/C拓展设置页面&#xff0c;点击卸载右边的小箭头&#xff0c;点击安装特定版本 安装老版本的C…

AI 数字人模型 Hallo2:让图片开口说话,一键修复模糊人脸

Hallo2 是由复旦大学 (Fudan University)、百度公司 (Baidu Inc) 和南京大学 (Nanjing University) 于 2024 年联合开发的一项先进技术&#xff0c;旨在生成长时间、高质量的唇形视频。该技术在原有的 Hallo 模型基础上进行了多项创新和改进&#xff0c;使其能够应对长时间视频…

模型训练数据-MinerU一款Pdf转Markdown软件

模型训练数据-MinerU一款Pdf转Markdown软件-说明 简介&#xff1a; MinerU是什么 MinerU是上海人工智能实验室OpenDataLab团队推出的开源智能数据提取工具&#xff0c;专注于复杂PDF文档的高效解析与提取。MinerU能将包含图片、公式、表格等元素的多模态PDF文档转化为易于分析…

Spring07——AOP通知以及几个相关案例

切入点表达式 注意&#xff0c;不是参数&#xff0c;是参数类型 可以使用通配符描述切入点&#xff0c;快速描述 ■ *&#xff1a;单个独立的任意符号&#xff0c;可以独立出现&#xff0c;也可以作为前缀或者后缀的通配符出现 execution(public∗com.itheima.∗.UserServi…

【ETCD】【源码阅读】configurePeerListeners() 函数解析

configurePeerListeners 是 ETCD 的一个核心函数&#xff0c;用于为集群中节点之间的通信配置监听器&#xff08;Peer Listener&#xff09;。这些监听器主要负责 Raft 协议的消息传递、日志复制等功能。函数返回一个包含所有监听器的列表。 函数签名 func configurePeerList…

Kafka怎么发送JAVA对象并在消费者端解析出JAVA对象--示例

1、在pom.xml中加入依赖 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-stream-kafka</artifactId><version>3.1.6</version></dependency> 2、配置application.yml 加入Kafk…

为了安全,自己搭建KMS,成功激活Office2010

在本篇文章中&#xff0c;将全过程描述Office Professional Plus 2010 With SP1 VOL从下载到自建KMS服务器再到激活的过程。本文展示的是64位版本&#xff0c;32位版本的方法类似。 特别注意&#xff1a;KMS激活仅限于VOL 版本&#xff0c;其他的零售版无法激活&#xff01;&am…

Unity 基于Collider 组件在3D 物体表面放置3D 物体

实现 从鼠标点击的屏幕位置发送射线&#xff0c;以射线监测点击到的物体&#xff0c;根据点击物体的法线向量调整放置物体的位置及朝向。 Ray ray Camera.main.ScreenPointToRay(Input.mousePosition); if (Physics.Raycast(ray, out RaycastHit hit, 100)) {obj.transform.…

【RDMA】RDMA read和write编程实例(verbs API)

WRITE|READ编程&#xff08;RDMA read and write with IB verbs&#xff09; &#xff08;本文讲解的示例代码在&#xff1a;RDMA read and write with IB verbs | The Geek in the Corner&#xff09; 将 RDMA 与verbs一起使用非常简单&#xff1a;首先注册内存块&#xff0c…

HTML5教程-表格宽度设置,最大宽度,自动宽度

HTML表格宽度 参考&#xff1a;html table width HTML表格是网页设计中常用的元素之一&#xff0c;可以用来展示数据、创建布局等。表格的宽度是一个重要的参数&#xff0c;可以通过不同的方式来设置表格的宽度&#xff0c;本文将详细介绍HTML表格宽度的不同设置方式和示例代…

2024年12月9日Github流行趋势

项目名称&#xff1a;ollama / ollama 项目维护者&#xff1a;mxyng, jmorganca, dhiltgen, BruceMacD, technovangelist等项目介绍&#xff1a;快速上手使用Llama 3.2、Mistral、Gemma 2及其他大型语言模型。项目star数&#xff1a;101,591项目fork数&#xff1a;8,117 项目名…

IntelliJ+SpringBoot项目实战(29)--如何将Beetl的模板文件放在独立的文件目录

在实际的项目开发中&#xff0c;为了方便前端人员调试页面&#xff0c;所以有必要将Beetl的模板文件放在独立的目录下&#xff0c;方便前端人员维护&#xff0c;而不是打包到项目的jar包中&#xff0c;如果打包到项目的jar包中还有另外的问题&#xff0c;就是一改动页面就要重新…

在Ubuntu上使用IntelliJ IDEA:开启你的Java开发之旅!

你好&#xff0c;年轻的学徒&#xff01;&#x1f9d1;‍&#x1f4bb; 是时候踏上进入Java开发世界的史诗之旅了&#xff0c;我们的得力助手将是强大的IntelliJ IDEA。准备好了吗&#xff1f;出发吧&#xff01; 在我们开始之前&#xff0c;我们需要下载这个工具。但是&#…

GWAS分析先做后学

大家好&#xff0c;我是邓飞。 GWAS分析是生物信息和统计学的交叉学科&#xff0c;上可以学习编程&#xff0c;下可以学习统计。对于Linux系统&#xff0c;R语言&#xff0c;作图&#xff0c;统计学&#xff0c;机器学习等方向&#xff0c;都是一个极好的入门项目。生物信息如…