读书人

请问一个stl源码剖析里的一个有关问题

发布时间: 2012-02-12 17:16:33 作者: rapoo

请教一个stl源码剖析里的一个问题
第3.4节 Traits编程技法--STL源代码门钥 开头这样讲述
迭代器所指对象的型别,称为该迭代器的value type.上述的参数型别推导技巧虽然可用于value type,却非全面可用:万一value type必须用于函数的传回值,就束手无策了,毕竟函数的"template 参数推导机制"推而导之的只是参数,无法推导函数的返回值型别



这段话,我觉得可以推导啊,请看下面例子:
#include <iostream>
using namespace std;

template<class I,class T>
void func_impl(I iter,T t)
{
T tmp;
}

template <class I>
I func(I iter)
{
func_impl(iter,*iter);
return iter;
}

int main(int argc, char* argv[])
{
int i=10;
int *b=func(&i);
cout<<*b<<endl;
system("pause");
return 0;
}

返回值可以是模板类型的啊

[解决办法]
  这个问题我也碰到过,现在也算是半懂不懂了。。
期待高手给与回答。
我帮lz说明以下,就是stl为啥要用萃取技术,在我们菜鸟眼里看来,就是多次一举,template就可以全部搞定。。。。。。。。。。
帮顶
[解决办法]
我觉得首先楼主弄明白:“无法推导函数的返回值型别”什么意思,

你举的例子和这句话没有什么关系。你的例子仅仅说明模板参数可以作为返回值类型,或反之。但这里的返回类型和推导没有

关系。

另外,我觉得其实traits其实本质上是为不同的类型提供统一的接口,光用模板的话可能很多问题都可以用函数重载来代替traits。大概意思。


[解决办法]
lz试这个就知道能不能推导返回类型了。

C/C++ code
template   <class T, class   I>T   func(I   iter){func_impl(iter,*iter);return   iter;}
[解决办法]
template <class T>
struct Iterator{
typedef T value_type;
};

template<class T>
typename T::value_type
Distance(T first,T last)
{
typedef typename T::value_type value_type;
return value_type(0);
}

Iterator<int> first,last;
Distance(first,last); //调用
你看上面这段代码,如果不采用Traits编程技法的话,你有办法指定返回值吗?

读书人网 >C++

热点推荐