stl源码剖析一书上的 traits的特化版本的疑问

bsnry 2012-03-20 08:54:00
问题:照着书上写了一个简单的traits, 发现作者提供的特化版本理解不了。


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 MyTraits { //page 87 页的版本
typedef typename T::value_type value_type;
};

template<class T> //这个是我自己写的
struct MyTraits<T*> //解决原生指针
{
typedef typename T::value_type value_type;
};

/*

page 88页 提供 MyTraits<T*>的 特化版本如下:

template<class T>
struct MyTraits<T*>
{
typedef typename T value_type;
};

另外还有这么一段文字:于是,原生指针int* 虽然不是一种class type, 亦可透过traits取其value type.........


问题在于: 我提供的traits的特化版本和作者的不一样, 为什么作者会这样写? 当使用一个MyTraits的使用,类型肯定是迭代器MyIter进行匹配,

,另外MyIter中定义了类型,那么 我的应该没有错啊。

*/



//多一层次的traits
template<class T>
typename MyTraits<T>::value_type TestFunc( T iter)
{
return *iter;
}



...全文
115 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
深圳小北 2012-03-21
  • 打赏
  • 举报
回复
楼主,我也在看stl源码剖析,,咱两一起研究
mosal 2012-03-20
  • 打赏
  • 举报
回复
typedef typename T::value_type value_type; //针对迭代器类中的value_type
typedef typename T value_type; //针对原生指针的value_type 都是为了得到一个type最后最为指针解引用的返回类型
bsnry 2012-03-20
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 mingliang1212 的回复:]
首先楼主对迭代器的定义还不懂吧.


指针是一种迭代器.这个traits作为得到迭代器的信息的辅助类,应该也支持指针.

MyTraits<int*>::value_type 应该是int ,因为这是整型指针指向的数据的类型.也就是value_type的含义.

但是你的写法 MyTraits<int*>::value_type 会出错.
[/Quote]

终于有人说到点子上了, 多谢

我根据你说的, 修改了一下,并付了一个 使用:

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 MyTraits {
typedef typename T::value_type value_type;
};

template<class T>
struct MyTraits<T*> //解决原生指针
{
typedef T value_type;
};


//多一层次的traits
template<class T>
typename MyTraits<T>::value_type TestFunc( T iter)
{
return *iter;
}

int main()
{
int* p= new int(200);

MyTraits<int*>::value_type iter2= TestFunc(p); // 解决原生指针

int data=20;

MyIter<int> iter3(&data);

MyTraits<MyIter<int>>::value_type iter4=TestFunc(iter3);


return 0;
}
mosal 2012-03-20
  • 打赏
  • 举报
回复
原生指针 就是所谓原生态内置类型指针 而非一个自定义类型指针或自定义类型中的指针变量
downmooner 2012-03-20
  • 打赏
  • 举报
回复
我觉得stl最终会毁在typedef上....
iamnobody 2012-03-20
  • 打赏
  • 举报
回复
首先楼主对迭代器的定义还不懂吧.


指针是一种迭代器.这个traits作为得到迭代器的信息的辅助类,应该也支持指针.

MyTraits<int*>::value_type 应该是int ,因为这是整型指针指向的数据的类型.也就是value_type的含义.

但是你的写法 MyTraits<int*>::value_type 会出错.
bsnry 2012-03-20
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 pengzhixi 的回复:]
迭代器里面也有value_type的typedef啊
[/Quote]

是对的,MyIter 中确实有个typedef T value_type


我自己的的 traits特化版本:
template<class T>
struct MyTraits<T*>
{
typedef typename T::value_type value_type; //正因为迭代器有个typedef ,所以这样定义,很自然啊
};



page 88页 提供 MyTraits<T*>的 特化版本如下:

template<class T>
struct MyTraits<T*>
{
typedef T value_type; // 就比较奇怪了,当MyTraits< 迭代器指针> 这样使用的时候,就成了typedef 迭代器指针 value_type; 很明显作者的版本和我写的,差异非常大啊。
};
深圳小北 2012-03-20
  • 打赏
  • 举报
回复
stl 源码第一次看,看得云里雾里的
pengzhixi 2012-03-20
  • 打赏
  • 举报
回复
迭代器里面也有value_type的typedef啊
深圳小北 2012-03-20
  • 打赏
  • 举报
回复
lz 弄懂了告诉我啊

64,680

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧