当前位置: 首页 > news >正文

关于模板函数的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;
}

 执行结果:

小结

http://www.lryc.cn/news/513994.html

相关文章:

  • 重现ORA-01555 细说Oracle Undo 数据管理
  • 通过blob请求后端导出文件
  • 养老院小程序怎么搭建?让老年人老有所养,老有所依!
  • 【2024美国数学建模AB题原文翻译】
  • 判断旗帜是否符合ISO新标准
  • 海量数据存储实现方案设计1-mycat版
  • Elasticsearch检索之三:官方推荐方案search_after检索实现(golang)
  • hot100_238. 除自身以外数组的乘积
  • 软件测试基础详解
  • MySQL 备份方案设计之准备事项
  • 《计算机网络A》单选题-复习题库解析-最终
  • 向 SwiftUI 视图注入 managedObjectContext 环境变量导致 Xcode 预览(Preview)崩溃的解决
  • Ruby 数据类型
  • 复合机器人正以其高效、精准、灵活的特点,逐渐在汽车装配线上崭露头角
  • Docker + JMeter + InfluxDB + Grafana搭建压测可视化实时监控
  • leetcode 2658. 网格图中鱼的最大数目
  • Java 集合 Collection、List、Set
  • 报错:nginx [emerg] open() etcnginxnginx.conf failed (2 No such file or directory)
  • 基于AI的运维资源调度:效率与智能的双重提升
  • 自动化办公 | 根据成绩进行自动评级
  • 纯血鸿蒙ArkUI线性布局详解
  • 小程序组件 —— 22 组件案例 - 轮播区域绘制
  • 如何判断一个学术论文是否具有真正的科研价值?ChatGPT如何提供帮助?
  • 【置顶】测试学习笔记整理
  • 新浪微博Java开发面试题及参考答案
  • 【SQL Server】教材数据库(1)
  • Windows系统下载、部署Node.js与npm环境的方法
  • SQL 总结
  • 设计一个基于Spring Boot开发的电商网站,部署在阿里云上
  • Java jni调用nnom rnn-denoise 降噪