我理解的 C++ 参数推导

今天在看 STL源码解析,正好看到迭代器所指类型,假设我们在应用中,只给出迭代器类型,而在你的函数中,需要声明一个迭代器所指的类型。怎么办?

上面的话可能读起来不太好懂。下面用例子来说明:

1 template<class T>
2 fun(T t)

在上面的代码中,你将T赋为T = int*,但是你在函数fun(T t)中,你却要声明一个int类型的变量来使用,怎么办呢?有什么办法呢?

这个时候就可以用到“参数推导”。

以我目前的理解,参数推导就是一个自动匹配的过程,例如:

1 template<class T, class I>
2 void fcout(T t, I u)
3 {
4     cout<<t - u<<endl;
5 }
6 
7 fcout(22, 9.8);

上面使用fcout函数时,并没有显示指定模板中的参数,即并没有使用fcout<int, double>(22, 9.8) ,但系统为我们自动进行了匹配。那么我认为参数推导也是一样。看下面的例子:

 1 template <class I, class T>
 2 void func_impl(I iter, T t)
 3 {
 4     T tmp;//这里要用到迭代器所指之物的类型
 5     //....
 6 }
 7 
 8 template<class I>
 9 void func(I iter)
10 {
11     func_impl(iter, *iter);//func的工作的全部移往func_impl
12 }
13 
14 int main()
15 {
16     int i;
17     func(&i);
18 }

上面的代码中,func_impl(iter, *iter) 没有显示声明模板的类型,但是编译器匹配出来了,得到I = (iter的类型),T = (*iter的类型)。

以上只是我个人的理解,或许有些不对,但我希望对知识有一个自己通俗的理解。

原文地址:https://www.cnblogs.com/hengli/p/2560155.html