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

学习模板元编程(3)enable_if

目录

行为

实现代码

enable_if_t

注意事项


行为

enbale_if调用方式如下

std::enable_if<布尔型变量,类型>::type

假如第一个输入参数为真,则最终的type与enbale_if<>模板里第二个输入参数的类型相同;否则模板匹配失败。

实现代码

下面是enable_if代码的大致实现:

template<class T>
struct enable_if<bool, T>{}template<class T>
struct enable_if<true, T>
{using type = T;
}

可见,如果enable_if的第一个输入参数为假,则匹配第一个enable_if模板。此时enable_if不含有type,故任何enable_if::type的调用都是无效的,匹配失败;

只有当enable_if的第一个输入参数为真,enable_if才含有type类型,且此时type对应类型T。

enable_if_t

template<bool b, class T>
using enable_if_t = typename enable_if<b, T>::type;

enable_if_t是C++14引入的,其功能是简化enable_if<...>::type

注意事项

理论上,你可以做如下操作:

#include <iostream>template<class T>
typename std::enable_if<std::is_integral<T>::value, T>::type func(T t)
{return t + 10;
}template<class T>
typename std::enable_if<!std::is_integral<T>::value, T>::type func(T t)
{return t;
}int main(void)
{std::cout << func(50) << std::endl;std::cout << func(0.1) << std::endl;std::cin.get();return 0;
}

上述代码确实在编译时实现了类似运行时if-else的功能。但是根据scott meyes的《Effective C++ 11》,避免将enable_if用作函数签名:在返回值或者输入参数里使用enable_if来实现模板匹配是不被提倡的

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

相关文章:

  • CART算法:Gini指数
  • 25.机器学习入门:让机器变聪明的魔法课
  • 串口通信初始化过程是怎样的???
  • IDEA 快捷编辑指南
  • Java开源代码源码研究:我的成长之路与实战心得分享
  • IDEA 安装插件的两种方式
  • 【面试场景题】异地多活改造方案
  • AI大模型--提示词工程
  • CVPR医学图像三套创新方案:通用分割+3D高效解码+SSM肿瘤定位(附链接)
  • 如何解决网站长期不连接数据库后首次连接缓慢的问题?
  • JS--判断是对象还是数组
  • Spring之【详解AOP】
  • 使用 Docker-Compose 部署 Redis 三主三从集群(含 Exporter 监控)
  • SQL Server从入门到项目实践(超值版)读书笔记 23
  • Windows 11 安装 JDK 11
  • ThreadLocal的原理是什么,使用场景有哪些?
  • 【自动化运维神器Ansible】playbook案例解析:Handlers与Notify机制深度解析
  • Vue3入门到精通:2.4 Vue3动态组件与异步组件深度解析
  • leetcode经典题目——单调栈
  • 【Python 工具人快餐 · 第 7 份 · 完结】
  • Redis 监控与优化方案(C++项目)
  • [激光原理与应用-221]:设计 - 皮秒紫外激光器 - 常见技术难题、原因与解决方案
  • 北京天津廊坊唐山打捞失物日记
  • Docker-04:CGroups资源控制组
  • Go语言--语法基础8--函数定义与调用--错误处理
  • Java学习第一百二十三部分——HTTP/HTTPS
  • 基于VuePress2开发文档自部署及嵌入VUE项目
  • 【RH134知识点问答题】第 4 章 归档和传输文件
  • 【浮点数存储】结构、精度说明
  • 联邦学习之------VT合谋