锐英源软件
第一信赖

精通

英语

开源

擅长

开发

培训

胸怀四海 

第一信赖

当前位置:锐英源 / 开源技术 / C++开源社区 / enable_if用于自定义make_unique的理解

服务方向

人工智能数据处理
人工智能培训
kaldi数据准备
小语种语音识别
语音识别标注
语音识别系统
语音识别转文字
kaldi开发技术服务
软件开发
运动控制卡上位机
机械加工软件
量化预测
股票离线分析软件
软件开发培训
Java 安卓移动开发
VC++
C#软件
汇编和破解
驱动开发

联系方式

固话:0371-63888850
手机:138-0381-0136
Q Q:396806883
微信:ryysoft

锐英源精品原创,禁止转载和任何形式的非法内容使用,违者必究。点名“简易百科”和“闲暇巴”盗用锐英源原创内容。


enable_if用于自定义make_unique的理解


最近学习httplib源代码,里面一段代码风格比较新奇,和大家交流下。

template <class T, class... Args>
typename std::enable_if<!std::is_array<T>::value, std::unique_ptr<T>>::type
make_unique(Args &&...args) {
  return std::unique_ptr<T>(new T(std::forward<Args>(args)...));
}

template <class T>
typename std::enable_if<std::is_array<T>::value, std::unique_ptr<T>>::type
make_unique(std::size_t n) {
  typedef typename std::remove_extent<T>::type RT;
  return std::unique_ptr<T>(new RT[n]);
}

这代码意思好明白,就是重载make_unique来支持多参数和数组,好理解,但是里面的typename和enable_if不好理解。

typename是提示后面是个类型,在泛型里是这样用,不是说后面make_unique是个类型,它是函数,不可能是类型,不要用typename的第一功能误解到一起。

typedef typename std::remove_extent<T>::type RT;这行是typename第一功能,类型别名功能。

enable_if是泛型的?:,当满足尖括号后第一个条件时::type会是第二个部分的类型,是合法类型,第一条件不满足时,这段代码不成立不处理。

type是enable_if的类型成员,代码是:using type = _Ty;enable_if结构体里就没有属性成员,相当于结构体是个跳板。

泛型一直是国内大学生学生C++的难点,泛型可以理解为一种修饰结合,国外说英文经常是子句套子句,所以对修饰好理解,咱们国内不行。

友情链接
版权所有 Copyright(c)2004-2024 锐英源软件
统一社会信用代码:91410105098562502G 豫ICP备08007559号 最佳分辨率 1440*900
地址:郑州市金水区文化路97号郑州大学北区院内南门附近