zoukankan      html  css  js  c++  java
  • 我理解的 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的类型)。

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

  • 相关阅读:
    用nodejs删除mongodb中ObjectId类型数据
    关于easyui模拟win2012桌面的一个例子系列
    div里常用的class命名
    XMLHttpRequest对象中readyState与status的几种常见状态
    我们经常注册用的页面是怎么实现的
    html与xhtml区别
    mysql重置密码
    服务器80端口映射到8080端口
    服务器端增加tomcat使用内存
    更新服务器ssh登录端口
  • 原文地址:https://www.cnblogs.com/hengli/p/2560155.html
Copyright © 2011-2022 走看看