64,639
社区成员
发帖
与我相关
我的任务
分享
template <class T>
struct MyIter {
typedef T value_type;
T* ptr;
MyIter(T* p = 0) : ptr(p) {}
T const & operator*() const { return *ptr; }
};
template<class T>
struct MyIter<T*>
{
typedef T value_type;
T* ptr;
MyIter(T* p=0):ptr(p){}
T const & operator*() const { return *ptr; }
};
//使用迭代器的一个函数,获得迭代器所指的对象。
template<class I>
typename I::value_type TestFunc( I iter)
{
return *iter;
}
template <class I>
struct iterator_traits {
Typedef I::value_type value_type;
}
template <class T>
struct iterator_traits<T*> {
typedef T value_type;
};
我写了两个迭代器, 迭代器类型有两种:FirstCategory和SecondCategory.
一个接口函数MyAdvance, 其模拟std::advance,我发现,我写的不能够支持原生指针。
代码如下:
struct FirstCategory
{
};
struct SecondCategory:public FirstCategory
{
};
//迭代器1
template <class T>
struct MyIter {
typedef T value_type;
typedef T* pointer;
typedef T& reference;
typedef FirstCategory category; //迭代器类型
T* ptr;
MyIter(T* p = 0) : ptr(p) {}
T& operator*() const { return *ptr; }
};
//迭代器2
template <class T>
struct MyIter2 {
typedef T value_type;
typedef T* pointer;
typedef T& reference;
typedef SecondCategory category; //迭代器类型
T* ptr;
MyIter2(T* p = 0) : ptr(p) {}
T& operator*() const { return *ptr; }
};
//萃取机
template <class T>
struct MyTraits {
typedef typename T::value_type value_type;
typedef typename T::reference reference;
typedef typename T::category category;
};
template<class T>
struct MyTraits<T*>
{
typedef T value_type;
typedef T& reference;
typedef T category;
};
template<class T>
struct MyTraits<T const*>
{
typedef T value_type;
typedef T const& reference;
typedef T category;
};
template<class Iter >
void _MyAdvance(Iter iter, int n , FirstCategory)
{
cout<<"MyIterCategory"<<endl;
}
template<class Iter>
void _MyAdvance(Iter iter, int n , SecondCategory)
{
cout<<"MyIterCategory2"<<endl;
}
//接口类, 模拟std::advance这个函数
template<class Iter>
void MyAdvance(Iter iter, int n)
{
_MyAdvance(iter,n, MyTraits<Iter>::category()); //当iter不是迭代器,是原生指针的时候,就会出错,原因是无法匹配_MyAdvance
}
比如:iter是int* ,Mytraits<int*>::category()榨取出来的就是int,就无法调用_MyAdvance这个函数模板了。。
我该怎么修改,让其支持 原生指针。 std::advance是支持原生指针的。
template <class T>
struct MyIter {
typedef xxx_traits<T>::value_type value_type;
value_type* ptr;
MyIter(value_type* p = 0) : ptr(p) {}
value_type const & operator*() const { return *ptr; }
};
class Test
{
int* ptr; //仅仅用来指向一个整形变量
public:
Test(int* pdata=0 ):ptr(pdata){}
~Test(){ delete ptr; }
int* operator->( ) const
{
return ptr;
}
int operator* () const
{
return *ptr;
}
};
#include <iostream>
#include <algorithm>
#include <vector>
template <typename T>
void increaser(T iter)//这个函数的功能是让迭代器参数指向的内容加1
{
//在这个函数里面我们只知道迭代器的类型,不知道迭代器的其他信息,比如要知道他指向的类型,那么就要用下面的方法:
std::iterator_traits<T>::value_type value;//当然,本例中没有必要用这个变量,这里只是为了演示.
value = *iter + 1;
*iter = value;
}
int main()
{
int arr[100] = {0};
increaser(arr + 1);//这里的参数是 int* 类型,不是类类型,所以,不能用 Iterator::value_type这种方法来得到他的元素类型.
std::vector<int> vec(100);
increaser(vec.begin() + 1);//类类型的迭代器.
std::cout<<arr[1]<<std::endl<<vec[1];
system("pause");
}