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

ops/2024/12/14 4:46:00/
目的:

学习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.ppmy.cn/ops/141723.html

相关文章

畅阅读微信小程序+ssm

摘 要 随着社会的发展&#xff0c;社会的方方面面都在利用信息化时代的优势。互联网的优势和普及使得各种系统的开发成为必需。 本文以实际运用为开发背景&#xff0c;运用软件工程原理和开发方法&#xff0c;它主要是采用java语言技术和mysql数据库来完成对系统的设计。整个…

高效Python开发工具PyCharm v2024.3全新发布,进一步提升编码体验!

JetBrains PyCharm是一种Python IDE&#xff0c;其带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具。此外&#xff0c;该IDE提供了一些高级功能&#xff0c;以用于Django框架下的专业Web开发。 立即获取PyCharm v2024.3正式版 Python 针对dataclass_transfor…

C++ 泛编程—— 自动推导类型 auto

C 自动推导类型 auto 自动推导类型函数模板类模板 C泛编程&#xff0c;也叫通用编程。包括三方面内容&#xff1a; 自动推导类型、 函数模板、 类模板。 自动推导类型 在C11中&#xff0c;赋予了auto全新的含义&#xff0c;不再用于修饰变量&#xff0c;而是作为一个类型指…

vue2实现在el-table里修改数据,插入输入框,并且根据输入数据,影响该行其他关联数据

<div class"content-all"><div class"content-tit">填写内容</div><div class"content-text"><el-radio v-model"radio" label"1">计划负荷</el-radio><el-radio v-model"radi…

Horovod:分布式深度学习训练库;Horovod库中DistributedOptimizer

目录 Horovod:分布式深度学习训练库 环境准备 代码示例 运行脚本 Horovod库中DistributedOptimizer DistributedOptimizer的作用 举例说明 Horovod:分布式深度学习训练库 Horovod是一个开源的分布式深度学习训练库,它能够在多个节点(机器)和多个GPU上高效地并行运行…

信创国产化时代:打造安全高效的信创网站解决方案

在全球科技竞争日益激烈的背景下&#xff0c;信创国产化已经成为中国信息技术领域的重要战略选择。信创国产化&#xff0c;即信息技术应用创新与国产化&#xff0c;旨在通过自主研发和创新&#xff0c;推动核心技术的国产化&#xff0c;减少对外部技术的依赖&#xff0c;确保国…

ESlint代码规范,手动与自动修复

规范说明 规则参考 - ESLint - 插件化的 JavaScript 代码检查工具 规范说明 ​ ​ 可看到是main.js文件报错分别是第三行第30个字符&#xff0c;以及第七行第一个字符 后面则是规范说明&#xff0c;可以根据说明查找相应的规范 一.手动修正 ctrl f 可以搜索 二.自动修正 …

动态规划 —— 子数组系列-环形子数组的最大和

江河入海&#xff0c;知识涌动&#xff0c;这是我参与江海计划的第7篇。 1. 环形子数组的最大和 题目链接&#xff1a; 918. 环形子数组的最大和 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/maximum-sum-circular-subarray/description/ 2. 题目解析…