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

无用知识研究:在trailing return type利用decltype,comma operator在对函数进行sfinae原创 [二]

一个可以正确编译运行的例子,但并不是trailing return:

#include <iostream>template<typename T, typename std::enable_if_t<std::is_integral<T>::value,int> * = nullptr >auto foo(T)-> void
{std::cout << "I'm an integer!\n";
}template<typename T, typename std::enable_if_t<std::is_floating_point<T>::value, double>* = nullptr >
auto foo(T)-> void
{std::cout << "I'm a floating point number!\n";
}int main() 
{foo(5);foo(3.4);
}运行结果:
I'm an integer!
I'm a floating point number!

一个会出现编译错误的例子,注意foo1的写法,为什么不对?:

#include <iostream>template<typename T>
auto foo1(T) ->decltype(std::is_integral<T>(), void{})
{std::cout << "I'm an integer!\n";
}template<typename T>
auto foo1(T) ->decltype(std::is_floating_point<T>(), void{})
{std::cout << "I'm a floating point number!\n";
}int main() 
{foo1(5);foo1(3.4);
}编译错误信息:
C2668	“foo1”: 对重载函数的调用不明确
E0308	有多个 重载函数 "foo1" 实例与参数列表匹配:	错误点大概有:
1、void{}要改成void()
2、std::is_integral<T>()的类型,有T的替换过程(也就是‌substitution‌),对于foo1(5),
类型就是std::is_integral<int>,
也就是说第一个foo1的返回类型是(std::is_integral<int>,void),也就是void。
但没有像enable_if这样有个推导过程。
所以对于第二个foo1,按照上面的推导过程,它的返回类型也是void,没有推导,
所以才会有提示:
C2668	“foo1”: 对重载函数的调用不明确

编译信息如下,主要是foo1带来的,foo没问题:

看个正确写法的例子:

豆包搜:举一个C++的例子:在trailing return里利用decltype判断为浮点数的sfinae的例子

#include <iostream>#include <type_traits>  // 包含is_floating_point和enable_if// 重载1:当T是浮点数时,此函数有效(通过SFINAE筛选)
template <typename T>
auto is_float(T value) -> decltype(// 逗号表达式:先检查enable_if的条件,再取value的类型作为返回值类型std::enable_if_t<std::is_floating_point_v<T>>(),  // 若T不是浮点数,这里会替换失败value  // decltype的最终结果是T(即函数返回值类型为T)) {std::cout << "类型是浮点数,值为: " << value << std::endl;return value;
}// 重载2:当T不是浮点数时,此函数有效(通过SFINAE筛选)
template <typename T>
auto is_float(T value) -> decltype(std::enable_if_t<!std::is_floating_point_v<T>>(),  // 若T是浮点数,这里会替换失败value) {std::cout << "类型不是浮点数,值为: " << value << std::endl;return value;
}int main() {// 测试浮点数类型is_float(3.14f);    // float(浮点数)is_float(3.14);     // double(浮点数)is_float(0.0L);     // long double(浮点数)// 测试非浮点数类型is_float(42);       // int(非浮点数)is_float('a');      // char(非浮点数)is_float(true);     // bool(非浮点数)return 0;
}

http://www.dtcms.com/a/494669.html

相关文章:

  • APDU交互代码模拟
  • Linux性能分析系统和虚拟文件系统缓存初始化
  • 用python做网站和用php网站建设验收单意见怎么写
  • 德芙巧克力网站开发方案怎样宣传一个网站
  • 模式识别与机器学习课程笔记(4):线性判决函数
  • 无人机空中定位与一键返航原理详解
  • P12874 [蓝桥杯 2025 国 Python A] 巡逻||题解||图论
  • 律师在哪个网站做国家企业信用系统官网
  • mapbox基础,栅格图片切片并发布、加载
  • 深入 RFC 793:TCP 报文头部、MSS 协商与三次握手 / 四次挥手全解析
  • deconv(多项式除法)
  • unitree rl gym项目实践记录2:通过TensorBoard查看奖励曲线
  • 2.8、权限的终极目标:提权与持久化
  • 模式识别与机器学习课程笔记(11):深度学习
  • 网站流量站怎么做WordPress的登录页面
  • leetcode 191. 位1的个数 python
  • 河北住房与城乡建设部网站北京做网站企业
  • WordPress网站转APP插件家具设计
  • docker 学习dockerfile 构建 Nginx 镜像-部署 nginx 静态网
  • Prompt Engineering 核心知识:从基础模式到思维链,掌握大模型高效交互秘籍
  • Android中加载unity aar包实现方案
  • auxiliary英文单词学习
  • Elasticsearch:创建一个定制的 DeepSeek 嵌入推理端点
  • “自然搞懂”深度学习系列(基于Pytorch架构)——01初入茅庐
  • 51c~Pytorch~合集6
  • Java 对接印度股票数据源实现 http+ws实时数据
  • 建设网站分析报告陕西四通建设工程有限责任公司网站
  • 微信网站建设app公司WordPress邮箱注册慢
  • 【Qt】元对象系统:从实际开发中看QML/C++交互原理
  • 【MySQL】从零开始了解数据库开发 --- 数据表的索引