精通
英语
和
开源
,
擅长
开发
与
培训
,
胸怀四海
第一信赖
服务方向
联系方式
锐英源精品原创,禁止转载和任何形式的非法内容使用,违者必究。点名“简易百科”和“闲暇巴”盗用锐英源原创内容。
最近学习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++的难点,泛型可以理解为一种修饰结合,国外说英文经常是子句套子句,所以对修饰好理解,咱们国内不行。