这个萃取着实不是很好理解,今天自己写了一段代码以至于自己都改了半天才输出想要的结果。
#include <iostream>
using namespace std;
template<class T>
struct MyIter {
typedef T value_type;
T* ptr;
MyIter(T* p = 0) : ptr(p) { }
T& operator*() const { return *ptr; }
};
template<class I>
struct iter_traits {
typedef typename I::value_type value_type;
};
template<class I>
struct iter_traits<I*> {
typedef I value_type;
};
template<class O>
void func(O ite)
{
typedef iter_traits<O>::value_type MyType;
MyType a = reinterpret_cast<MyType>(**ite);
cout << *ite << endl;
cout << **ite << endl;
cout << a << endl;
}
int main()
{
int *a = new int(2);
MyIter<int*> ite(&a);
func(ite);
return 0;
}
这里MyIter是个迭代器类模板,模板参数类型为T,main函数中这个T为int*, 那我们定义一个参数为int*的迭代器对象,对这个迭代器取内容就应该是int*,实际上是个指针, 这里定义了一个萃取用的结构体iter_traits,普通版的是做为萃取出int*这个类型,便于作为函数返回值或者是定义变量,偏特化版的用做萃取出int类型。
#include <iostream>
using namespace std;
template<class T>
struct MyIter {
typedef T value_type;
T* ptr;
MyIter(T* p = 0) : ptr(p) { }
T& operator*() const { return *ptr; }
};
template<class I>
struct iter_traits {
typedef typename I::value_type value_type;
};
template<class I>
struct iter_traits<I*> {
typedef I value_type;
};
template<class O>
void func(O ite)
{
typedef iter_traits<O::value_type>::value_type MyType;
MyType a = 50;
cout << a;
}
int main()
{
int *a = new int(2);
MyIter<int*> ite(&a);
func(ite);
return 0;
}
另一份代码 O::value_type 是int*, MyType 萃取出了int..
写着写着自己都迷糊了 第一份代码有一点问题,MyType应该是个int*,不是int,第二份才是int
第一份代码中的func应该如下写法
template<class O>
void func(O ite)
{
typedef iter_traits<O>::value_type MyType;
MyType a = *ite;
cout << *a;
}
自STL源码剖析88页