1. enable_if 原理

关于 enable_if 原理这里就不细说了,网上有很多,可以参考如下教程,这里只讲解用法实例,涵盖常规使用全部方法

文章1
文章2
文章3

1. 所需头文件

#include <type_traits>

2. 返回参数特化

//the return type (bool) is only valid if T is an integral type
template <typename T>
typename std::enable_if<std::is_integral<T>::value, bool>::type
is_odd(T i)
{
    return bool(i % 2);
}

3. 函数参数特化

场景1:只有一个函数

template <typename T>
int fun(T i, typename std::enable_if<std::is_integral<T>::value, int>::type =  0) { return 1; }

场景2:函数重载(效果等同于“4. 模板参数特化之模板重载”)

//此模板 T 接收 integer 型参数
template <typename T>
int fun(T i, typename std::enable_if<std::is_integral<T>::value, int>::type =  0) { return 1; }

//此模板 T 接收非 integer 型参数
template <typename T>
int fun(T i, typename std::enable_if<!std::is_integral<T>::value, int>::type =  0) { return 2; }

4. 模板参数特化

方法1:
//the second template argument is only valid if T is an integral type
template <typename T,
 typename = typename std::enable_if<std::is_integral<T>::value>::type
>    //enable_if 的第二个参数是 void 型,在 typename = typename ... 场景下可以不特别指出第二个参数,在没有 = 号的场景下,不仅要指出而且还要给一个默认值,如“方法2”
bool is_even(T i)
{
    return bool(i % 2);
}

方法2:
//the second template argument is only valid if T is an integral type
template<typename T,
 typename std::enable_if<std::is_integral<T>::value, int>::type = 0
>
bool is_even(T i)
{
    return bool(i % 2);
}

5. 模板参数特化之模板重载(效果等同于“2. 函数参数特化 > 场景2:函数重载”)


未完 ......

点击访问原文(进入后根据右侧标签,快速定位到本文)

最新文章

  1. 用Ghost进行备份还原
  2. SetZOrder 无效
  3. ajax无刷新删除、复制 THINKPHP
  4. Windows Azure HandBook (6) Azure带宽与Azure Blob云存储
  5. JavaScript——exec和match
  6. ajax请求json数据案例
  7. 通过数据库方式访问excel 2007及其以后(xlsx)文件的连接字符串
  8. Flume协作框架
  9. [POJ 3370] Halloween treats
  10. ifconfig命令
  11. Node.js权威指南 (5) - 使用Buffer类处理二进制数据
  12. 手机页面关于头部固定定位与input出现的问题
  13. [置顶] location.href你真的会用了?
  14. Oracle dump 分析secondary key
  15. 2013 吉林通化邀请赛 Tutor 有点坑的水题
  16. altera DDR2 IP核之仿真
  17. 单细胞参考文献 single cell
  18. sqlserver删除临时表中的数据
  19. 电脑时间显示秒 win10电脑显示农历
  20. python如何使用request爬取图片

热门文章

  1. hbase错误记录部分总结
  2. WAMP本地环境升级php版本操作步骤(详细)
  3. meshing-网格加密
  4. mac编译Cpython
  5. intellij idea tomcat 启动不生成war包
  6. Java8中LocalDate的使用---项目中日期处理
  7. [spring-boot] 多环境配置
  8. windows 共享文件夹,和共享打印机
  9. Qt *.pro工程文件 详解
  10. CMU Database Systems - Concurrency Control Theory