关于模板函数的void返回值的判断:std::is_void与模板特化
int返回值的函数参数测试
#include <iostream>
#include <functional>int return_int_func(){std::cout << __func__ << std::endl << std::flush;return 10086;
}template<class U>
auto CallDeviceMethodShort(std::function<U()> method) -> std::invoke_result_t<decltype(method)> {auto ret = method();return ret;
}int main(int argc, char *argv[])
{std::cout << CallDeviceMethodShort<int>(return_int_func) << std::endl << std::flush;return 0;
}
void类型的函数
#include <iostream>
#include <functional>void return_void_func(){std::cout << __func__ << std::endl << std::flush;
}template<class U>
auto CallDeviceMethodShort(std::function<U()> method) -> std::invoke_result_t<decltype(method)> {auto ret = method();return ret;
}int main(int argc, char *argv[])
{CallDeviceMethodShort<void>(return_void_func);return 0;
}
报错:

解决办法:模板特化
错误的实例
#include <iostream>
#include <functional>int return_int_func(){std::cout << __func__ << std::endl << std::flush;return 10086;
}void return_void_func(){std::cout << __func__ << std::endl << std::flush;
}template<class U>
auto CallDeviceMethodShort(std::function<U()> method) -> std::invoke_result_t<decltype(method)> {auto ret = method();return ret;
}//模板特化
template<class U>
void CallDeviceMethodShort(std::function<void()> method) {method();
}int main(int argc, char *argv[])
{CallDeviceMethodShort<void>(return_int_func);CallDeviceMethodShort<void>(return_void_func);return 0;
}
执行结果

由结果可知,两次调用的都是函数CallDeviceMethodShort,这显然不是我们想要的结果
正确的实例:
#include <iostream>
#include <functional>
#include <type_traits>#define END (std::endl) << (std::flush)#define OUT(a) \std::cout << #a<< "=" << a << ENDfloat return_float_func(){std::cout << __func__ << END;return 1.0086;
}int return_int_func(){std::cout << __func__ << END;return 10086;
}void return_void_func(){std::cout << __func__ << END;
}template<class U,std::enable_if_t<!std::is_void<U>::value, int> = 0>
auto CallDeviceMethodShort(std::function<U()> method) -> std::invoke_result_t<decltype(method)>
{auto ret = method();std::cout << __func__ << __LINE__ << END;return ret;
}//模板特化
template<class U, std::enable_if_t<std::is_void<U>::value, int> = 0>
void CallDeviceMethodShort(std::function<U()> method) {method();std::cout << __func__ << __LINE__ << END;
}int main()
{int a = CallDeviceMethodShort<int>(return_int_func);OUT(a);float f = CallDeviceMethodShort<float>(return_float_func);OUT(f);CallDeviceMethodShort<void>(return_void_func);return 0;
}
执行结果:

小结
相关文章:
关于模板函数的void返回值的判断:std::is_void与模板特化
int返回值的函数参数测试 #include <iostream> #include <functional>int return_int_func(){std::cout << __func__ << std::endl << std::flush;return 10086; }template<class U> auto CallDeviceMethodShort(std::function<U()&g…...
重现ORA-01555 细说Oracle Undo 数据管理
1. 概述 1.1. Undo 数据应用 undo数据是: 原始的、修改之前的数据副本 是针对更改数据的每个事务处理所捕获的 至少保留到事务处理结束 用于支持: 回退操作 读取一致性查询 闪回查询、闪回事务处理和闪回表 从失败的事务处理中进行恢复 1.2. 事…...
通过blob请求后端导出文件
后端controller PostMapping("/exportPlanProject2")public void exportActive(RequestBody IfPlanListDTO plan, HttpServletResponse httpServletResponse) throws IOException {}后端service public void exportExcel2(HttpServletResponse response) throws IOEx…...
养老院小程序怎么搭建?让老年人老有所养,老有所依!
随着社会老龄化的加剧,养老服务成为一个越来越重要的话题。在这个互联网的时代,养老院也开始拥抱技术,借助小程序的便捷性来改善老年人的居住和生活体验。那么,如何搭建一个适合老年人的养老院小程序呢?本文将从实际操作的角度出…...
【2024美国数学建模AB题原文翻译】
2024 MCM 问题A:资源可用性与性别比例 虽然一些动物物种超出了通常的雄性或雌性性别范畴,但大多数物种要么是雄性要么是雌性。尽管许多物种在出生时展现出1:1的性别比例,其他物种则偏离了这个性别比例,这被称为适应性性别比例变化…...
判断旗帜是否符合ISO新标准
背景介绍 在全球化的背景下,不同国家的旗帜设计需要满足某些国际标准以便于统一化和规范化。ISO(国际标准化组织)提出了一项新规定,要求国家旗帜在设计时遵循一些规则,特别是棋盘状设计中的颜色分布规则。比如&#x…...
海量数据存储实现方案设计1-mycat版
目的 这里使用mycat为例子说明方案设计思路(仅个人学习、思考笔记)。主要尝试解决海量数据存储、动态不停机扩容问题,不再受限于单库、单表、单机等。 mycat简述 mycat 主要以中间件代理的方式,不侵入工程代码来实现分库分表&a…...
Elasticsearch检索之三:官方推荐方案search_after检索实现(golang)
Elasticsearch8.17.0在mac上的安装 Kibana8.17.0在mac上的安装 Elasticsearch检索方案之一:使用fromsize实现分页 快速掌握Elasticsearch检索之二:滚动查询(scrool)获取全量数据(golang) 1、search_after检索 在前面的文章介绍了fromsize的普通分页…...
hot100_238. 除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...
软件测试基础详解
🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 “尽早的介入测试,遇到问题的解决成本就越低” 随着软件测试技术的发展,测试工作由原来单一的寻找缺陷逐渐发展成为预防缺陷,…...
MySQL 备份方案设计之准备事项
MySQL 备份方案设计之准备事项 文章目录 MySQL 备份方案设计之准备事项1.选择合适的备份工具2.其他需要考虑的因素推荐资料 1.选择合适的备份工具 工欲善其事,必先利其器。 目前市面上的 MySQL 备份工具也有很多,整理如下(仅供参考ÿ…...
《计算机网络A》单选题-复习题库解析-最终
目录 151、信道容量计算公式“CW*log2(1S/N)”中,“S/N”表示( ) 152、下面哪一种编码方式不包含同步时钟信息( ) 153、子网划分的根本目的是( ) 154、在传统以太…...
向 SwiftUI 视图注入 managedObjectContext 环境变量导致 Xcode 预览(Preview)崩溃的解决
问题现象 从 SwiftUI 诞生到现在,我们这些秃头码农们早已都习惯了在 Xcode 预览中调试 App 界面了。不过,对于某些场景下向 SwiftUI 视图传递 managedObjectContext 环境变量(environment)总是会导致 Xcode 预览崩溃,这是怎么回事呢? 如上图所示,甚至我们将一个常驻内存…...
Ruby 数据类型
Ruby 数据类型 Ruby,作为一种动态、开放源代码的编程语言,以其简洁明了的语法和强大的功能而闻名。在Ruby中,数据类型是编程的核心组成部分,它们决定了变量可以存储的信息种类以及可以对这些信息执行的操作。Ruby是一种类型安全的…...
复合机器人正以其高效、精准、灵活的特点,逐渐在汽车装配线上崭露头角
随着全球汽车制造业的快速发展,汽车装配线已成为衡量企业生产效率和技术水平的重要标准。传统的装配方式往往依赖于大量的人工操作,这不仅效率低下,还面临着质量不稳定、安全隐患等问题。然而,随着智能科技的飞速进步,…...
Docker + JMeter + InfluxDB + Grafana搭建压测可视化实时监控
一:简单介绍 为了解决上述问题,必须要请出了 InfluxDB + Grafana : InfluxDB :持续型数据库,有时间戳组件,以时间的形式去存储数据; Grafana :一款采用 Go 语言编写的开源应用,主要用于大规模指标数据的可视化展现,是网络架构和应用分析中最流行的时序数据展示工具…...
leetcode 2658. 网格图中鱼的最大数目
题目如下 数据范围 使用并查集来做这道题。 其实按照题目的意思就是让我们求每一个联通的水域可以捞到的最大权值。 我们可以从前往后遍历这个二维数组只需要判断前一个水域和上一个水域是否和当前的(i, j)联通如果有则合并水域,同时用一个weight数组保存每一个联…...
Java 集合 Collection、List、Set
一. Collection 单列集合 1. Collection代表单列集合,每个元素(数据)只包含一个值 2. Collection集合特点 ① List系列集合:添加的元素是有序、可重复、有索引。 ArrayList、LinekdList:有序、可重复,有索引 ② Set系列集合&…...
报错:nginx [emerg] open() etcnginxnginx.conf failed (2 No such file or directory)
报错:nginx: [emerg] open() “/etc/nginx/nginx.conf” failed (2: No such file or directory) 背景:在创建nginx容器时,想把宿主机上的某一目录挂载到容器的/etc/nginx路径,报错"/etc/nginx/nginx.conf" failed (2:…...
基于AI的运维资源调度:效率与智能的双重提升
在现代运维场景中,随着系统复杂性和服务规模的不断增长,传统的资源调度方式已无法满足高效、动态和精准的需求。AI技术的引入为资源调度带来了新的解决方案,通过智能算法和数据驱动,实现了资源分配的自动化与优化。本文将详细探讨…...
光模块PCB设计学习记录01
/*光模块布局,有错误可以指出,有不足可以补充*/ 光模块PCB布局规划 01导入板框与结构约束导入 这里的outline板框一般由机械提供.dxf文件,板框决定PCB尺寸、器件可用区域和接口位置;成功导入dxf文件后,打开Board Geo…...
终极指南:使用EdgeRemover专业卸载工具彻底移除Microsoft Edge浏览器
终极指南:使用EdgeRemover专业卸载工具彻底移除Microsoft Edge浏览器 【免费下载链接】EdgeRemover A PowerShell script that correctly uninstalls or reinstalls Microsoft Edge on Windows 10 & 11. 项目地址: https://gitcode.com/gh_mirrors/ed/EdgeRem…...
书匠策AI官网www.shujiangce.com:论文降重降AIGC的隐藏玩法,99%的毕业生还不知道!
💀 论文人的"红色恐惧症",你中招了吗? 各位论文战士们,今天不聊选题、不聊框架,咱聊点真正让人血压飙升的事——查重报告上那片触目惊心的红色。 你有没有经历过这种场景:熬了两个通宵写完一章…...
从10G到40G/50G:UltraScale+以太网IP核升级实战与GT资源规划
1. 从10G到40G/50G的升级挑战 当你第一次把项目从10G升级到40G/50G以太网时,最直观的感受就是"资源突然不够用了"。我去年接手一个视频处理项目时就深有体会——原本在10G环境下游刃有余的FPGA设计,切换到40G后GT资源立刻捉襟见肘。这里说的GT…...
Circuit Playground Express 硬件解析与四步编程实战:从创客入门到项目开发
1. 项目概述:为什么选择 Circuit Playground Express 作为创客起点 如果你对硬件编程、物联网或者智能设备感兴趣,但又被 Arduino Uno 上密密麻麻的杜邦线和面包板劝退,或者觉得树莓派 Zero 的 Linux 系统门槛太高,那么 Adafruit…...
告别原生标题栏!用Qt 6.x打造一个可拖拽、可美化的自定义标题栏(附完整源码)
Qt 6.x自定义标题栏实战:从零构建高颜值可拖拽界面组件 当你在开发一款专业级桌面应用时,系统默认的标题栏往往会成为整体UI设计的短板。不同操作系统下的标题栏风格各异,无法与应用主体保持视觉统一,更难以实现个性化的交互效果。…...
【Qt串口实战】硬件升级后readyRead信号丢失的排查与修复
1. 问题现象:硬件升级后readyRead信号神秘消失 那天早上刚到公司,硬件组的同事兴冲冲地跑过来告诉我:"老王,我们给设备升级了最新固件,性能提升30%!"我心想这是好事啊,结果打开调试软…...
C语言状态模式实战:从设计思想到嵌入式状态机实现
1. 项目概述:从“状态”到“模式”的思维跃迁在嵌入式开发、游戏逻辑、网络协议解析乃至日常的业务流程控制中,我们常常会面对一个核心挑战:如何优雅地管理一个对象随着内部条件改变而表现出的不同行为?比如,一个自动售…...
体验Taotoken官方价折扣与活动价带来的实际成本节省
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 体验Taotoken官方价折扣与活动价带来的实际成本节省 对于开发者与团队而言,大模型API的调用成本是项目预算中不可忽视的…...
冒险岛游戏编辑器:Harepacker-resurrected 一站式解决方案完整指南
冒险岛游戏编辑器:Harepacker-resurrected 一站式解决方案完整指南 【免费下载链接】Harepacker-resurrected All in one .wz file/map editor for MapleStory game files 项目地址: https://gitcode.com/gh_mirrors/ha/Harepacker-resurrected 想要个性化定…...
