STL迭代器之一:偏特化
在stl的算法中运用容器的迭代器时,很可能经常会用到迭代器相应型别(例如迭代器所指物的型别),假设算法中有必要声明一个变量,以“迭代器所指对象的型别”为类型,如何是好,例如我们写一个功能,打印迭代器元素的值:
template <class T>
struct MyIter
{
typedef T value_type;
T* ptr;
MyIter(T* p = NULL):ptr(p){}
T& operator*()const {return *ptr;}
}; template <class T>
typename T::value_type func(T iter)
{
return *iter;
} int main()
{
MyIter<int> ite(new int());
printf("%d", func(ite));
return ;
}
但是我们无法支持原生指针,比如
int a = 10;
int b = func(&a);
这里偏特化可以帮我们实现,"所谓partial specialization"的意思就是提供另一份template的定义式,而其本身仍为templatized”。
“针对(任何)template 参数更进一步的条件限制所设计出来的一个特化版本”——《泛型思维》
第一步定义iterator_traits中间层:
template <class T>
struct MyIter
{
typedef T value_type;
T* ptr;
MyIter(T* p = NULL):ptr(p){}
T& operator*()const {return *ptr;}
}; //针对带内嵌类型的迭代器
template <class I>
struct iterator_traits
{
typedef typename I::value_type value_type;
}; template <class T>
typename iterator_traits<T>::value_type func(T iter)
{
return *iter;
} int main()
{
MyIter<int> ite(new int());
printf("%d", func(ite)); return ;
}
输出:8
第二步,针对原生指针设计一个特化版本:
template <class T>
struct MyIter
{
typedef T value_type;
T* ptr;
MyIter(T* p = NULL):ptr(p){}
T& operator*()const {return *ptr;}
}; //针对带内嵌类型的迭代器
template <class I>
struct iterator_traits
{
typedef typename I::value_type value_type;
}; //针对原生指针
template <class I>
struct iterator_traits<I*>
{
typedef I value_type;
}; template <class T>
typename iterator_traits<T>::value_type func(T iter)
{
return *iter;
} int main()
{
MyIter<int> ite(new int());
printf("%d\n", func(ite));
int a = 1;
printf("%d\n", func(&a));
return ;
}
但是假设我在func里面希望做如下操作:
template <class T>
typename iterator_traits<T>::value_type func(T iter)
{
typename iterator_traits<T>::value_type a;
a++; //这里将报错,const 常量无法修改
return *iter;
}
我们希望的效果是:只想定义一个T类型的数据类型,如果需要const修饰,我们自己在类型前面加个const即可。
于是我们还要对const T*设计一个特化版本:
template <class T>
struct MyIter
{
typedef T value_type;
T* ptr;
MyIter(T* p = NULL):ptr(p){}
T& operator*()const {return *ptr;}
}; //针对带内嵌类型的迭代器
template <class I>
struct iterator_traits
{
typedef typename I::value_type value_type;
}; //针对原生指针
template <class I>
struct iterator_traits<I*>
{
typedef I value_type;
};
//针对const原生指针
template <class I>
struct iterator_traits<const I*>
{
typedef I value_type;
}; template <class T>
typename iterator_traits<T>::value_type func(T iter)
{
typename iterator_traits<T>::value_type a;
a++;
return *iter;
} int main()
{
MyIter<int> ite(new int());
printf("%d\n", func(ite));
int a = ;
const int* pa = &a;
func(pa); return ;
}
STL迭代器之一:偏特化的更多相关文章
- C++的模板特化 和 STL中iterator_traits模板的偏特化
C++中有类模板和函数模板,它们的定义如下所示: 类模板: template<class T1,class T2> class C { //... }; 函数模板: template< ...
- [C++ 2011 STL (VS2012 Update4) 源代码阅读系列(2)]熟悉一些宏定义和模版偏特化或叫模版专门化
[C++ 2011 STL (VS2012 Update4) 源代码阅读系列(2)]熟悉一些宏定义和模版偏特化或叫模版专门化 // point_test.cpp : 知识点练习和测试,用于单步调试,跟 ...
- STL 全特化/偏特化
template<class T> class Compare { public: static bool isEqual(const T& lh,const T& rh) ...
- STL全特化与偏特化
在泛型编程中,常常会使用一些非完全泛型的类模板,这就是特化. 如何理解全特化呢?如上图所示,第一个template class是空间配置器的类模板,第二个就是一个全特化的template class. ...
- stl迭代器原理
具体实现肯定不如书上讲的清楚了,这里只是根据侯捷书上的讲解,自己建立一条思路以及形成一些相关的概念 迭代器也可被称作智能指针,用于遍历容器内的元素,stl每个容器都实现了自己的iterator,ite ...
- [转]Traits 编程技法+模板偏特化+template参数推导+内嵌型别编程技巧
STL中,traits编程技法得到了很大的应用,了解这个,才能一窥STL奥妙所在. 先将自己所理解的记录如下: Traits技术可以用来获得一个 类型 的相关信息的. 首先假如有以下一个泛型的迭代器类 ...
- 一步一步的理解C++STL迭代器
一步一步的理解C++STL迭代器 "指针"对全部C/C++的程序猿来说,一点都不陌生. 在接触到C语言中的malloc函数和C++中的new函数后.我们也知道这两个函数返回的都是一 ...
- STL——迭代器与traits编程技法
一.迭代器 1. 迭代器设计思维——STL关键所在 在<Design Patterns>一书中对iterator模式定义如下:提供一种方法,使之能够依序巡访某个聚合物(容器)所含的各个元素 ...
- oop &&GP 模板 ---> 特化和偏特化
OOP面向对象编程 GP泛型编程(generic programming) 两者的主要区别就是OOP将数据和对数据的操作放在一起, GP就是将数据和操作独立开来 GP: 数据就是container ...
随机推荐
- java1234教程系列笔记 S1 Java SE chapter 02 lesson 03 java基本数据类型
第二章 第三节 数据类型 3.1 分类 基本数据类型.引用类型 3.2整型 byte 8 short 16 int 32 long 64 作业: A:1-10求和 B:float double 的最 ...
- OWIN是什么?
OWIN的英文全称是Open Web Interface for .NET. 如果仅从名称上解析,可以得出这样的信息:OWIN是针对.NET平台的开放Web接口. 那Web接口是谁和谁之间的接口呢?是 ...
- Delphi写的DLL回调C#
C#的调用Delphi的DLL没有问题,DLL回调时遇到了麻烦,网上找了个方法,解决了这个问题 Delphi部分,列举了三种回调函数定义 library test; uses SysUtils; {$ ...
- Nginx安装、配置文档
Nginx介绍 nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行.由俄罗斯的程序设计师Igor Sysoev所开发 ...
- Date和Calendar时间操作常用方法及示例
package test; import java.text.SimpleDateFormat;import java.util.Calendar;import java.util.Date; /** ...
- MSSTDFMT.DLL无法注册的解决
今天在使用Windows8的时候,发现了一个问题,当我想执行某个xxx.exe文件的时候,报的问题是MSSTDFMT.DLL无法注册. 但是我的系统又是64位的,那么可以这样操作: 从网上下载一个ms ...
- OAF_开发系列07_实现OAF下拉菜单的上下联动Poplist Synchor(案例)
20150706 Created By BaoXinjian
- vue组件一
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- [Linux] 关于Centos6中ulimit nproc用户进程数的限制
一.缘由: 在启动mongodb的时候,有Warning提示soft rlimits too low,就是用户使用进程数过小,遂调高系统资源关于用户最大进程数的限制ulimit -u. 先暂时使设置生 ...
- boost相关
1 boost 常用函数 <1> tcp跟udp的收发函数名 tcp收发 async_write async_read async_read_until udp收发 async_send_ ...