首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

<stl源码剖解> 参数推导

2013-01-05 
stl源码剖析 参数推导stl源码剖析p85页//function template 参数推导(argument deducation) 机制templ

<stl源码剖析> 参数推导
<stl源码剖析>  p85页


//function template 参数推导(argument deducation) 机制
template <class I,class T>
void func_impl(I iter,T t)
{
T tmp;//这里解决了问题,T就是迭代器所指的性别
}
template <class I>
inline 
void func(I iter)
{
func_impl(iter,*iter);  //该函数意思是不是取Iter得指针 I* temp = *iter;
}

int main()
{
int i;
func(&i);
return 0;
}

这里func_impl(iter,*iter);函数意思是不是为了取Iter得指针 I* temp = *iter;?
我是初学者,请问为什么template <class I>这个是取不到指针类型的呢?
[解决办法]
func_impl(iter,*iter); 意思是
void func_impl(I iter,T t) 中的 t = *iter;

即从func_impl(iter, *iter) 编译器推导出I类型是iter类型, 这里即&i类型
但如果没有T t,虽然在func_impl里面进行*iter可以得到 i 类型的变量,但无法做 int tmp; 这样的操作.
理解下可能对iter的参数推导可以得到它指向的变量,但无法分离出该变量类型出来供你使用.
所以直接对某些类型指针或者迭代器类型的参数推导还不够, 需要直接对其所指向的类型进行推导.
好比 func_impl(&i, i) 编译器参数推导后就知道产生如下代码
void func_impl(int *iter, int var);  I 为int * 而 T为 int
这里的var或者上面func_impl(I iter, T t)中的t相当一个哑元,没有用. 因为可以通过对iter解引用取到
其值, 但是加上T t,编译器就能直接给出能并且能在代码里使用的 T 类型,即 *iter/var类型

热点排行