一、测试程序1

#include <iostream>
#include <type_traits>
using namespace std; template <typename T>
typename std::enable_if<std::is_integral<T>::value,bool>::type
gt_zero (T i) { cout << "is integral" << endl;return i>0;
}
template <typename T>
typename std::enable_if<!std::is_integral<T>::value,bool>::type
gt_zero (T i) { cout << "is NOT integral" << endl;return i>0;
}int main() {short int i = 2;    float f = 3.1;std::cout << i << " greater than zero : " << gt_zero(i) << std::endl;std::cout << f << " greater than zero : " << gt_zero(f) << std::endl;return 0;
}

首先gt_zero是一个模板函数,typename std::enable_if<std::is_integral<T>::value,bool>::type是函数的返回值类型,std::enable_if<>一般是由两部分组成,第一个参数是一个判定式,当判定式为真时,std::enable_if<std::is_integral<T>::value,bool>::type的这个type数据成员存在,且值为bool,如果没有第二个参数,则默认值为void。如果判定式为假,type这个数据成员就是未定义的,更不存在值是什么。

但是编译器并不会因为type值不存在就报错,因为泛型编程中存在一个最优匹配原则,这个模板不成立,就去推断其他模板,所以gt_zero实际上同时是一个重载函数。

当第一个参数std::is_integral<T>::value为假时,!std::is_integral<T>::value肯定为真,所以第二个模板函数符合要求,同样std::enable_if<std::is_integral<T>::value,bool>::type的值为true。

执行结果:

is integral
1 greater than zero : 1
is NOT integral
3.1 greater than zero : 1

根据上文分析可以得到两次调用gt_zero函数第一次调用是第一个版本,第二次调用是第二个版本。

二、测试程序2

#include <iostream>
#include <type_traits>
using namespace std; template <typename T>
bool
gt_zero (T i, typename std::enable_if<std::is_integral<T>::value, T>::type j=0) { cout << "is integral" << endl;return i>0;
}
template <typename T>
bool
gt_zero (T i, typename std::enable_if<!std::is_integral<T>::value,T>::type j=0) { cout << "is NOT integral" << endl;return i>0;
}int main() {short int i = 2;    float f = 3.1;std::cout << i << " greater than zero : " << gt_zero(i) << std::endl;std::cout << f << " greater than zero : " << gt_zero(f) << std::endl;return 0;
}

有了第一个程序的铺垫,第二个测试程序就简单许多了。首先gt_zero函数的返回值类型已经被指定为bool类型了,gt_zero函数的第二个参数typename std::enable_if<std::is_integral<T>::value, T>::type j=0表明定义了一个j变量,但是type同样是在std::is_integral<T>::value成立的条件下才会有定义,成立时type的值是T,定义j这个变量大多时候的作用只是限制函数接收数据类型的种类,重载模板函数使得模板函数可以根据不同的数据类型执行不同的函数。

执行结果:

is integral
2 greater than zero : 1
is NOT integral
3.1 greater than zero : 1

三、测试程序3

#include <iostream>
#include <type_traits>
using namespace std; template <typename T, typename std::enable_if<std::is_integral<T>::value>::type* = nullptr>
bool
gt_zero (T i) { cout << "is integral" << endl;return i>0;
}
template <typename T, typename std::enable_if<!std::is_integral<T>::value>::type* = nullptr>
bool
gt_zero (T i) { cout << "is NOT integral" << endl;return i>0;
}int main() {short int i = 2;    float f = 3.1;std::cout << i << " greater than zero : " << gt_zero(i) << std::endl;std::cout << f << " greater than zero : " << gt_zero(f) << std::endl;return 0;
}

执行结果:

is integral
2 greater than zero : 1
is NOT integral
3.1 greater than zero : 1

四、std::is_integral

函数原型:template< class T > struct is_integral;
功能:检查 T 是否为整数类型。若 T 为 bool 、 char 、 char8_t 、 char16_t 、 char32_t 、wchar_t 、 short 、 int 、 long 、
long long 类型,或任何实现定义的扩展整数类型,包含任何有符号、无符号及 cv 限定的变体。则提供等于 true 的成员常量 value 。
否则, value等于 false 。

std::enable_if的用法相关推荐

  1. std::enable_if 的几种用法

    https://yixinglu.gitlab.io/enable_if.html std::enable_if 的几种用法 tech 12cpp 2 std::enable_if 顾名思义,满足条件 ...

  2. SNIFE 和 std::enable_if

    类型基础 在回顾模板之前,需要明确一个概念:模板编程是针对类型的计算..这和我们平时的代码不同,我们平时写的程序都是针对数据的. 在模板元编程中,typename 用于定义类型:using 用于给模板 ...

  3. C++ std::enable_if的简明指南

    1. 简介 std::enable_if是在C++ 11中引入的模板结构体,在头文件<type_traits>中定义. template < bool B, class T = vo ...

  4. std::enable_if

    std::enable_if 顾名思义,满足条件时类型有效.作为选择类型的小工具,其广泛的应用在 C++ 的模板元编程(meta programming)中.它的定义也异常的简单: template ...

  5. c++11 std::enable_if在模板偏特化的妙用

    1.模板自动推导功能. 先看个例子: 在调用TestTemplate函数时, 我们可以在函数后面加上<类型>无歧义地指定调用的版本. 结果如下: 由于模板参数在函数参数中的位置是固定的,编 ...

  6. C++11 std::bind std::function 高级用法

    C++11 std::bind std::function 高级用法 (c++11的新特性) 原文:https://blog.csdn.net/yangjie6898862/article/detai ...

  7. C++11模板元编程—std::enable_if使用说明

    std::enable_if 顾名思义,满足条件时类型有效.作为选择类型的小工具,其广泛的应用在 C++ 的模板元编程中.它的定义也非常的简单: // STRUCT TEMPLATE enable_i ...

  8. C++中std::string::find_last_of用法

    早上本来还看代码时本来还迷迷糊糊,结果被find_last_of一下给震醒了,std::string 使用了这么多年,今天才发现find_last_of只是用来查找字符的,多年来一直以为它可用来查找字 ...

  9. (C++模板编程):std::enable_if的使用(下)

    目录 std::enable_if的使用 std::enable_if std::enable_if源码 偏特化完全可以理解成一种(在编译期)条件分支语句. std::enable_if基础认识 en ...

最新文章

  1. ESXI5.5添加本地磁盘出错的解决
  2. Java经典面试题总结(一)
  3. Linux 解压后的启动流程分析
  4. 无意中发现的,自己看吧
  5. Java冒泡实现类Collections.sort()
  6. another CRM inbound debug - 另一个CRM中间件的调试记录
  7. 动态查找表之二叉搜索树
  8. Leaflet工作笔记-GIS地图上构造echarts的3D图
  9. 使用uiautomator2进行webview页面的测试
  10. python中的库有哪些餐厅_2017,最受欢迎的 15 大 Python 库有哪些?
  11. 阿里与网易考拉收购案谈崩?后者股价下跌5.01%
  12. easyui mysql手册_easyui api 中文
  13. MTK6763平台手机 在国外无法成功注册VOLTE。求解
  14. 在搜索框里添加放大镜的图标,且显示提示信息
  15. OceanBase 社区版 ODC 功能解读
  16. 网易音乐人2021年度盘点上线 揭晓2021年华语原创音乐年度记忆
  17. Github上一个优秀的Python学习资源:AwesomePythonResource
  18. 【前端框架】前端框架学习
  19. 深入探索Android卡顿优化
  20. scratch编程打字机

热门文章

  1. 需求文档 | 商业需求文档(BRD)
  2. UPS不间断电源系统安全使用要领
  3. 利用计算思维解决问题人和计算机都能完成,对计算思维能力养成与大学计算机基础课程改革的思考...
  4. win7打开仅计算机黑屏,黑屏只剩鼠标指针,详解win7打开电脑黑屏只剩鼠标指针的解决教程...
  5. AU变声功能音频调节
  6. win10桌面计算机怎么显示器,win10电脑三分屏怎么设置_win10电脑怎么分屏3个显示器...
  7. CA认证的原理和流程以及https完整通信过程
  8. 苏黎世大学计算机研究生费用,苏黎世联邦理工学院学费需要多少
  9. C#测试调用PaddleOCRSharp模块识别图片文字
  10. c语言编程题改错题怎么改,c语言编程改错题.doc