traits
前言
都说traits 是STL源码的钥匙,今天看来完了这一章节,确实强大,我先讲其实现的内部原理。在我看懂了traits之后,我就想,既然traits如此的强大,那我就以使用这的角度来领略它的美好,顺便加强它的理解,还是先浅谈traits的一些原理
为了取得iterator 的类型,在STL可花费了大量的精力:
迭代器的类型:
第一种获取迭代器的类型之法:利用模板函数参数推导机制:
看书中的例子:
//main函数中如此定义
int main()
{
int i;
func(&i); //这里传的是地址
}
//调用了func函数,我们来看看这个函数是怎样定义的
void func(I iter)
{
func_impl(iter,*iter);
//哦,又调用了另外一个函数,有两个参数,第一个是原来的参数 I类型,第二个是 *I 的类型,也就是*(&i) = i,恢复 了原来的对象类型
}//好的再看看func_impl到底有何玄机
template<class I, class T>
void fucn_impl(I iter, T t)
{
T tmp ;// 呵呵,T的类型那就是i的类型,那么在不知道i类型的情况下通过两巧妙的调用很好的利用了函数模板的参数推到机制
}
好的,很完美的推出了我们未知对象的类型,但是,如果我要的对象类型表示函数的返回值,那么这个方法就不可行了,因为我们是在间接调用了两个函数,而且最后在一个函数体的里边取得的类型
显然用于修饰函数的返回值不合适 ,这个办法不通用了,怎么办呢,书中的第二办法是声明内嵌类型
声明内嵌类型:
比如说:
</pre><pre name="code" class="cpp">template <class T>
struct MyIter
{
typedef T value_type;
//这句代码就可以通过value_type 来去的 T 这个类型了(如果对于这句代码的作用不太理解的话,
//可以看看我之前的那篇关于typedef的实验博客 <a target=_blank href="http://blog.youkuaiyun.com/dalleny/article/details/39016201">http://blog.youkuaiyun.com/dalleny/article/details/39016201</a>,