2017-4-14 模版类型推导和traits
来源:互联网 发布:免费刷钻软件安卓版 编辑:程序博客网 时间:2024/05/21 05:40
traits技法的诞生原因,模版的类型推导只能作用于函数的参数,并不能作用于函数的返回值。
例如以下这种情况,可以内嵌typedef去定义返回类型。
template <typename T>
struct Iter {
typedef T value_type;
.....
T& operator*() {....}
}
template <typename Iter>
typename Iter::value_type
func(Iter iter) {
return *iter;
}
这样做的问题是,对于非class_type的迭代器无效,例如原生指针
stl的算法模版并不只能用于class type,对于原生的非容器类也能很好的支持,比如我可以对一个
原生数组使用stl的find方法。指针也是迭代器,支持迭代器的一切操作。(迭代器也是根据指针的思想去设计的)
如何支持原生指针呢?偏特化可以做到。
偏特化是对于一个模版类,指定其某一个或者几个模版参数从而诞生的新模版。
例如,我们有一个模版类
templage <typename A, typename B, typename C>
class Tc {
...
}
然后我们可以特化一个版本
template <typename A, typename B, typename C>
class Tc<A, B, C*> {
....//根据参数列表特化的一个版本,也就是说,任何第三个参数是原生指针的Tc类,都会由此模版而不是第一个模版去产生
}
再比如:
template <typename T>
class A {
bool isEqual(const T& a, const T& b) {
return a == b;
}
}
//对于没有实现==的类(最好去实现他,这里只是举个例子),或者不能直接用==比较的类
template <>
class A<T> {
bool isEqual(const T& a, const T& b) {
bool result = false;
....//your own way
return result;
}
}
traits 技术正是利用偏特化特性,萃取迭代器(目前看来只有容器和迭代器在用)的类型信息
比如:
template <typename I>
struct IterTraits {
typedef I value_type;
}
这样一来,上面的func可以这样写:
template <typename I>
IterTraits<I>::value_type
func(I iter) {
return *iter;
}
对于原生指针,可以偏特化一个traits,func函数不用做任何改动
template <typename I>
struct IterTraits<I*> {
typedef I value_type;
}
例如以下这种情况,可以内嵌typedef去定义返回类型。
template <typename T>
struct Iter {
typedef T value_type;
.....
T& operator*() {....}
}
template <typename Iter>
typename Iter::value_type
func(Iter iter) {
return *iter;
}
这样做的问题是,对于非class_type的迭代器无效,例如原生指针
stl的算法模版并不只能用于class type,对于原生的非容器类也能很好的支持,比如我可以对一个
原生数组使用stl的find方法。指针也是迭代器,支持迭代器的一切操作。(迭代器也是根据指针的思想去设计的)
如何支持原生指针呢?偏特化可以做到。
偏特化是对于一个模版类,指定其某一个或者几个模版参数从而诞生的新模版。
例如,我们有一个模版类
templage <typename A, typename B, typename C>
class Tc {
...
}
然后我们可以特化一个版本
template <typename A, typename B, typename C>
class Tc<A, B, C*> {
....//根据参数列表特化的一个版本,也就是说,任何第三个参数是原生指针的Tc类,都会由此模版而不是第一个模版去产生
}
再比如:
template <typename T>
class A {
bool isEqual(const T& a, const T& b) {
return a == b;
}
}
//对于没有实现==的类(最好去实现他,这里只是举个例子),或者不能直接用==比较的类
template <>
class A<T> {
bool isEqual(const T& a, const T& b) {
bool result = false;
....//your own way
return result;
}
}
traits 技术正是利用偏特化特性,萃取迭代器(目前看来只有容器和迭代器在用)的类型信息
比如:
template <typename I>
struct IterTraits {
typedef I value_type;
}
这样一来,上面的func可以这样写:
template <typename I>
IterTraits<I>::value_type
func(I iter) {
return *iter;
}
对于原生指针,可以偏特化一个traits,func函数不用做任何改动
template <typename I>
struct IterTraits<I*> {
typedef I value_type;
}
0 0
- 2017-4-14 模版类型推导和traits
- C++ 中Traits技术 (4) —— 类型推导
- 模版类型推导
- C++ Traits编程技法--从迭代器的设计看参数推导与类型推导
- 函数模板中使用类型萃取(traits)替换类型推导(deduce)
- 泛型技巧系列:类型字典和Type Traits
- Swift常量和变量及类型推导
- 【C++模版之旅】神奇的Traits
- 【C++模版之旅】神奇的Traits
- 【C++模版之旅】神奇的Traits
- 【C++模版之旅】神奇的Traits
- 【C++模版之旅】神奇的Traits
- C++11:类型推导和追踪函数返回类型decltype
- shared_ptr的模版推导问题
- C++ template metaprogramming 第二章 Traits和类型操作(Type Manipulation)--2.1
- stl源码剖析 第三章iterator 和 type traits及POD类型
- Swift学习笔记之类型安全和推导
- C++ 11 学习1:类型自动推导 auto和decltype
- Brackets(续)
- Linux查看系统信息的一些命令及查看已安装软件包的命令
- 博客开题第一天
- ptb_producer注释
- GPU渲染管线概述
- 2017-4-14 模版类型推导和traits
- vs 2015 不是类或命名空间名称
- [机器学习](七)cs229之混合高斯模型
- MySQL中获取当前日期及当前时间的函数总结
- Java中的 多态
- 运维基础
- (python)用户输入一段英文,然后输出这段英文中所有长度为3的英文单词
- 局部对象
- Mybatis使用及原理解析