c++ 拆分函数返回值和参数类型
在c++中,函数参数类型和返回值类型通常是一个比较明确的信息,好像确实无需在这个上面费周折。然而,硬编码数据类型会让代码复用性下降,如果能够通过某种方式自动获取函数参数和返回值类型,对于代码的可复用性,可读性和整洁性都有较大的提升。最近阅读GoogleTest的源码(v1.8.1)发现,它采用了模板方法实现了这一点:
// googletest/googlemock/include/gmock/internal
/gmock-generated-internal-utils.h...
template <typename F>
struct Function;template <typename R>
struct Function<R()> {typedef R Result;...
};template <typename R, typename A1>
struct Function<R(A1)>: Function<R()> {typedef A1 Argument1;...
};template <typename R, typename A1, typename A2>
struct Function<R(A1, A2)>: Function<R(A1)> {typedef A2 Argument2;...
};template <typename R, typename A1, typename A2, typename A3>
struct Function<R(A1, A2, A3)>: Function<R(A1, A2)> {typedef A3 Argument3;...
};...
上面的代码,gmock在使用的时候是配合宏实现不同类型函数的统一。在实际开发中,我们可以借助decltype,auto以及函数指针的方式来对函数的返回值和参数类型进行统一拆分,只需对上述代码进行稍微调整即可:
template <typename T>
struct Function;//以下以__stdcall 调用类型为例,如果函数调用类型是 __cdcel, 则需要特化新的模板组
template <typename R>
struct Function<R __stdcall()> {typedef R RESULT;
};template <typename R, typename A1>
struct Function<R __stdcall(A1)> :Function<R __stdcall()>
{typedef A1 ARG1;
};template <typename R, typename A1, typename A2>
struct Function<R __stdcall(A1,A2)> :Function<R __stdcall(A1)>
{typedef A2 ARG2;
};template <typename R, typename A1, typename A2,typename A3>
struct Function<R __stdcall(A1, A2,A3)> :Function<R __stdcall(A1,A2)>
{typedef A3 ARG3;
};//如果是函数指针类型,可以用以下模板特化组
template <typename R>
struct Function<R(__stdcall*)()> {typedef R RESULT;
};template <typename R, typename A1>
struct Function<R(__stdcall*)(A1)> :Function<R(__stdcall*)()>
{typedef A1 ARG1;
};template <typename R, typename A1, typename A2>
struct Function<R(__stdcall*)(A1,A2)> :Function<R(__stdcall*)(A1)>
{typedef A2 ARG2;
};template <typename R, typename A1, typename A2,typename A3>
struct Function<R(__stdcall*)(A1,A2,A3)> :Function<R(__stdcall*)(A1,A2)>
{typedef A3 ARG3;
};// 如果有更多参数,可在此处扩展
测试代码:
int __stdcall STD_CALL_FUNC_WITH_ONE_PARAM(int b)
{int nn = 0;return nn;
}int main(int argc, char* argv[], char* env[])
{//typedef int (__stdcall *Func)(int);using Func = decltype(&STD_CALL_FUNC_WITH_ONE_PARAM);Func bvn = STD_CALL_FUNC_WITH_ONE_PARAM;Function<decltype(bvn)>::RESULT result1;Function<decltype(bvn)>::ARG1 arg1;auto funcAutoPtr = STD_CALL_FUNC_WITH_ONE_PARAM;Function<decltype(funcAutoPtr)>::RESULT result2;Function<decltype(funcAutoPtr)>::ARG1 arg2;Function<decltype(STD_CALL_FUNC_WITH_ONE_PARAM)>::RESULT result3;Function<decltype(STD_CALL_FUNC_WITH_ONE_PARAM)>::ARG1 arg3;return 0;
}
相关文章:
c++ 拆分函数返回值和参数类型
在c中,函数参数类型和返回值类型通常是一个比较明确的信息,好像确实无需在这个上面费周折。然而,硬编码数据类型会让代码复用性下降,如果能够通过某种方式自动获取函数参数和返回值类型,对于代码的可复用性,…...
Ubuntu 23.10安装TeXlive并安装CTEX中文支持
连接上互联网,打开SHELL命令行界面, 1. sudo apt install texlive texstudio texlive-lang-chinese 就可以安装好了。texlive-lang-chinese 是TEXLIVE对CTEX中文的支持。 2. Tex源文件必须采用UTF-8编码格式,编译器采用xelatex。这样对中文…...
SpringBoot中CommandLineRunner详解(含源码)
文章目录 前言实例导入库application.yamlRunnerSpringBootCommandLineRunnerApplication执行结果 先后顺序示例OrderRunner1OrderRunner2执行结果 通常用法加载初始化数据示例 启动后打印应用信息示例 启动异步任务示例 接口健康检查示例 外部服务调用示例 参数校验示例 动态设…...
通信基础(一):数据传输基础
一、波特率与比特率关系 比特率(信息传输速率、信息速率):指单位时间内在信道上传 送的数据量(即比特数),单位为比特每秒 (bit/s), 简记为b/s或bps。 波特率与比特率有如下换算关系: bitbaud *log 2(N) 其中, N是码元总类数。 特别注意ÿ…...
故障诊断模型 | Maltab实现BiLSTM双向长短期记忆神经网络故障诊断
文章目录 效果一览文章概述模型描述源码设计参考资料效果一览 文章概述 故障诊断模型 | Maltab实现BiLSTM双向长短期记忆神经网络故障诊断 模型描述 利用各种检查和测试方法,发现系统和设备是否存在故障的过程是故障检测;而进一步确定故障所在大致部位的过程是故障定位。故障…...
物联网和互联网医院小程序:如何实现医疗设备的远程监测和管理?
物联网(IoT)技术的发展为医疗设备的远程监测和管理提供了巨大的机会。结合互联网医院小程序,我们可以实现对医疗设备的远程访问、监控和管理,从而提高医疗服务的质量和效率。本文将介绍如何实现医疗设备的远程监测和管理ÿ…...
sharepoint2016-2019升级到sharepoint订阅版
一、升级前准备: 要建立新的sharepoint订阅版环境,需求如下: 1.单服务器硬件需求CPU 4核,内存24G以上,硬盘300G(根据要迁移的数量来扩容大小等); 2.操作系统需要windows server 20…...
CTFHub | MySQL流量、Redis流量、MongoDB流量的WriteUp
文章目录 MySQL流量题目题解 Redis流量题目题解 MongoDB流量题目题解 数据库类流量题需要用到Wireshark截取数据包,然后进行分析。 WireShark是非常流行的网络封包分析工具,可以截取各种网络数据包,并显示数据包详细信息。常用于开发测试过程…...
NSS刷题 js前端修改 os.path.join漏洞
打算刷一遍nssweb题(任重道远) 前面很简单 都是签到题 这里主要记录一下没想到的题目 [GDOUCTF 2023]hate eat snake js前端修改 这里 是对js的处理 有弹窗 说明可能存在 alert 我们去看看js 这里进行了判断 如果 getScore>-0x1e9* 我们结合上面…...
ArcGIS Maps SDK for JS:隐藏地图边框
文章目录 1 问题描述2 解决方案 1 问题描述 近期,将ArcGIS Api for JS v4.16更新到了ArcGIS Maps SDK for JS v4.27,原本去除地图的css代码失效了。 v4.26及以前版本 ,需要用.esri-view-surface--inset-outline:focus::after 控制边框属性。…...
带你秒懂MySQL!! 一万字详细知识点和基础操作 欢迎评论区怼我 (三)
表操作 创建 # 创建表结构 create table user(id int comment ID,唯一标志,username varchar(20) comment 用户名,name varchar(10) comment 姓名,age int comment 年龄,gender char(1) comment 性别 ) comment 用户表; 约束 非空约束限制该字段值不为nullnot null唯一约束保证…...
kubeadmin部署k8s1.27.4
kubeadmin部署k8s1.27.4 环境介绍 IP主机名资源配置系统版本192.168.117.170k8s-master2c2g200gCentos7.9192.168.117.171k8s-node12c2g200gCentos7.9192.168.117.172k8s-node22c2g200gCentos7.9 编辑本地解析且修改主机名 三台主机都要做 vim /etc/hosts配置主机名 mast…...
【Aurix Tricore】HighTec启动代码crt0-tc37x.c分析笔记
1. 前言 crt0是hightec 在其toolchain的gcc库中实现启动startup功能的核心代码。 HighTec已为tc3xx设置了一些默认的启动行为。在此启动过程中,目标被初始化并设置为其默认值。启动文件的代码在进入main()函数之前执行。之后,执行main()函数的构造函数。 编译器附带的启动…...
Linux高级命令(扩展)
一、find命令 1、find命令作用 在Linux操作系统中,find命令主要用于进行文件的搜索。 2、基本语法 # find 搜索路径 [选项 选项的值] ... 选项说明: -name :根据文件的名称搜索文件,支持*通配符 -type :f代表普通文…...
LLM在text2sql上的应用 | 京东云技术团队
一、前言: 目前,大模型的一个热门应用方向text2sql它可以帮助用户快速生成想要查询的SQL语句。那对于用户来说,大部分简单的sql都是正确的,但对于一些复杂逻辑来说,需要用户在产出SQL的基础上进行简单修改,…...
【MySQL】 复合查询 | 内外连接
文章目录 1. 复合查询多表笛卡尔积自连接在where子句使用子查询单行子查询多行子查询in关键字all关键字any关键字 多列子查询 在from子句中使用子查询合并查询unionunion all 2. 内连接3. 外连接左外连接右外连接 1. 复合查询 多表笛卡尔积 显示雇员名、雇员工资以及所在部门…...
【linux】麒麟v10安装openjdk8
openjdk的官网 点我就到官网 jdk8的网址 安装 yum install -y java-1.8.0-openjdk-devel 出现Complete! 就是安装完成。 验证 java -version配置环境变量 查找安装路径 find / -name java 修改配置文件 vim /etc/profile 增加内容 export JAVA_HOME/usr/lib/jvm/j…...
项目部署与上线
文章目录 多环境前端后端 原始部署安装nginx部署前端部署后端 宝塔Linux部署前端部署后端部署 Docker部署Docker平台部署(√)绑定域名跨域问题解决 多环境 项目部署上线 原始前端/后端宝塔Linux容器容器平台 多环境 同一套项目代码,在不…...
系统架构主题之八:非功能性需求对系统架构及设计的影响
从大的方面来讲,软件系统的需求分为功能性需求和非功能性需求。功能性需求一般由业务分解而来,是直接面向用户的需求,也是直接体现用户价值的需求。非功能性需求一般多是由功能性需求的内在要求衍生而来,其价值更多的体现在对功能…...
盛元广通化工实验室管理系统
随着时代的进步和网络技术的普及应用,管理化工实验室的日常工作和实验过程,企业科研单位对信息化、智能化和安全性日趋要求严格,根据化工实验室的实际需求出发,从完整的开发框架、调度引擎和丰富的组件、页面样例等快速响应应用需…...
别再被格式拖后腿了!Paperxie 用这招让本科论文排版一步到 “校标”
paperxie-免费查重复率aigc检测/开题报告/毕业论文/智能格式排版/文献综述/AI PPThttps://www.paperxie.cn/format/typesettinghttps://www.paperxie.cn/format/typesetting 你有没有过这种经历:导师只改了一句 “格式不对,重排”,你对着 Wor…...
PowerToys中文汉化终极指南:3步快速实现Windows效率工具完全本地化
PowerToys中文汉化终极指南:3步快速实现Windows效率工具完全本地化 【免费下载链接】PowerToys-CN PowerToys Simplified Chinese Translation 微软增强工具箱 自制汉化 项目地址: https://gitcode.com/gh_mirrors/po/PowerToys-CN 你是否曾因PowerToys的英文…...
Poppins几何无衬线字体:9种字重与多语言支持的技术实现深度解析
Poppins几何无衬线字体:9种字重与多语言支持的技术实现深度解析 【免费下载链接】Poppins Poppins, a Devanagari Latin family for Google Fonts. 项目地址: https://gitcode.com/gh_mirrors/po/Poppins Poppins几何无衬线字体是一款由Indian Type Foundry…...
别再在循环里写Thread.sleep()了!IntelliJ IDEA这个告警到底在说什么?
循环中的Thread.sleep():为什么IntelliJ IDEA警告你正在"忙等待"? 在IntelliJ IDEA中编写Java代码时,你是否遇到过这样的警告:"Call to Thread.sleep() in a loop, probably busy-waiting"?这个看…...
WinMerge过滤器进阶:从基础规则到实战场景配置
1. WinMerge过滤器入门:从零开始理解规则配置 WinMerge作为一款老牌开源文件对比工具,其过滤器功能常常被低估。很多开发者只是用它来排除版本控制目录,但实际上它能做的远不止这些。我第一次接触WinMerge过滤器是在处理一个Java项目时&#…...
多云配置管理工具MCP:统一编排AWS、GCP等云资源的实战指南
1. 项目概述:一个高效的多云配置管理工具 最近在梳理团队的基础设施配置时,发现了一个挺有意思的开源项目,叫 malminhas/mcp 。乍一看这个名字,你可能会有点懵,这缩写代表什么?其实,MCP 在这里…...
别再让电机烧了!聊聊工业设备中三相电源保护的两种经典电路设计与选型
工业三相电机保护电路设计实战:从原理到工程落地 在空压机房嘈杂的轰鸣声中,老王师傅正对着烧毁的电机摇头叹气——这已经是本月第三台因电源故障报废的设备。类似场景在工业现场屡见不鲜,统计显示超过40%的电机故障源于电源异常,…...
为智能硬件项目集成大模型能力利用Taotoken实现低成本高可用的方案
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 为智能硬件项目集成大模型能力利用Taotoken实现低成本高可用的方案 在智能家居、物联网等嵌入式硬件项目中引入大模型能力…...
MANT量化技术:大语言模型推理的硬件架构革新
1. MANT量化技术:大语言模型推理的硬件架构革新在人工智能领域,大语言模型(LLM)的推理效率一直是制约其实际应用的关键瓶颈。传统量化方法往往面临精度损失与硬件适配的双重挑战,而MANT技术的出现为这一困境提供了创新解决方案。作为一名深耕…...
Win11精简版系统缺失画图工具?三步教你从微软商店找回(附快速启动技巧)
Win11精简版系统缺失画图工具?三步教你从微软商店找回(附快速启动技巧) 不少追求系统流畅性的用户会选择安装第三方精简版Win11系统,却在需要基础功能时发现连画图工具都找不到了。这并非微软的疏漏,而是精简版系统为了…...
