类模板详解\n类模板的定义及实例化\ntemplate\u003Cclass 模板参数>\nclass 类名 {\n    // 类定义\n};\n\ntemplate\u003Ctypename 模板参数>\nclass 类名 {\n    // 类定义\n};\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n其中: template是声明类模板的关键字,表示声明一个模板,模板参数可以是一个,也可以是多个,可以是类型参数 ,也可以是非类型参数。类型参数由关键字class或typename及其后面的标识符构成。非类型参数由一个普通参数构成,代表模板定义中的一个常量。\n\n一般情况下,类模板的声明和实现在一个头文件内完成。如果采用声明实现分离的方式,在.h文件中声明,在.hpp文件中实现,使用该类模板时include目标.hpp文件。\nExample01\n\n// mytemplate.h\ntemplate\u003Cclass T>\nclass MathOp {\npublic:\n    T add(T &a, T &b);\n};\n// mytemplate.hpp\n#include \"mytemplate.h\"\n\ntemplate\u003Cclass T>\nT MathOp\u003CT>::add(T &a, T &b)\n{\n    T res = a + b;\n    return res;\n}\n\n// main.cpp\n#include \u003Ciostream>\n\n#include \"mytemplate.hpp\"\n\nint main(int argc, char** argv)\n{\n    MathOp\u003Cint> op;\n    int         a   = 1;\n    int         b   = 2;\n    auto        res = op.add(a, b);\n\n    std::cout \u003C\u003C \"1 + 2 = \" \u003C\u003C res \u003C\u003C std::endl;\n    return 0;\n}\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n// type为类型参数,width为非类型参数\ntemplate\u003Cclass type, int width>\n1\n2\n如果在全局域中声明了与模板参数同名的变量,则该变量被隐藏掉\n模板参数名不能被当作类模板定义中类成员的名字\n同一个模板参数名在模板参数表中只能出现一次\n在不同的类模板或声明中,模板参数名可以被重复使用\ntypedef string type;\ntemplate \u003Cclass type, int width>\nclass Graphics {\n    type           node;  //* node 不是string类型\n    typedef double type;  ///! error: 成员函数不能与模板参数type同名\n};\n\ntemplate \u003Cclass T, class T>  ///! error:重复使用名为T的参数\nclass Rect;\n\ntemplate \u003Cclass T>  //* 参数名\"T\"在不同模板间可以重复使用\nclass Round;\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n在类模板的前向声明和定义中,模板参数的名字可以不同\n/// MyStack声明都引用同一个类模板的声明\ntemplate \u003Cclass T>\nclass MyStack;\n\ntemplate \u003Cclass U>\nclass MyStack;\n\ntemplate \u003Cclass Tp>\nclass MyStack {\n    //* 模板定义中智能引用名字\"Tp\",不能引用\"T\"和\"U\"\n};\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n类模板参数可以有缺省实参,给参数提供缺省实参的顺序是先右后左\ntemplate \u003Cclass T, int size = 16>\nclass MyStack;\n1\n2\n类模板名可以被用作一个类型指示符。当一个类模板名被用作另一个模板定义中的类型指示符时,必须指定完整的实参表\ntemplate \u003Ctypename T>\nclass Graphics {\n    T* next;  //* 在类模板自己的定义中不需要指定完整模板参数表\n};\n\ntemplate \u003Ctypename T>\nvoid show(Graphics\u003CT>& g)\n{\n    Graphics\u003CT>* pg = &g;  //* 必须指定完整的模板参数表\n}\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n类模板实例化\n从通用的类模板定义中生成类的过程称为模板实例化\n\n//* T是一个形参,同类型的实参值被提供给该形参\n//* 指定的每个不同类型值都创建一个新类\ntemplate \u003Ctypename T>\nclass Graphics {\n    T m_value;\n};\n// 类实例化\n//* T被指定为int\nclass Graphics {\n    int m_value;\n};\n//* T被指定为double\nclass Graphics {\n    double m_value;\n};\n//* T被指定为string\nclass Graphics {\n    string m_value;\n};\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n类模板实例化分为显示实例化和隐士实例化\n\n显示实例化\ntemplate class Stack\u003Cint>; //将类模板实例化为一个处理int类型的Stack类\n1\n隐式实例化\nStack\u003Cchar> charStack; // 先实例化一个CharStack类(名字由编译器按规则生成),然后用CharStack char Stack;创建一个对象\nStack\u003Cint> intStack; // 实例化一个IntStack类,在调用IntStack intStack;创建一个对象\n1\n2\n类模板实例化的时机\n\n当使用了类模板实例的名字,并且上下文环境要求存在类的定义时\n对象类型是一个类模板实例,当对象被定义时。此点被称作类的实例化点\n一个指针或引用指向一个类模板实例,当检查这个指针或引用所指的对象时\n#include \u003Ciostream>\n\ntemplate \u003Ctypename T>\nclass Graphics {\n    // body\n};\n\nvoid func(Graphics\u003Cchar>);  // 函数声明,不需要实例化\n\nclass Rect {\n    Graphics\u003Cdouble>& rsd;  // 声明一个类模板引用,不需要实例化\n    Graphics\u003Cint>     si;   // si是Graphics类型的对象,需要实例化类模板\n};\n\nvoid func(Graphics\u003Cchar> p)\n{\n    // todo\n}\n\nint main(int argc, char** argv)\n{\n    Graphics\u003Cchar>* sc;  // 声明一个类模板指针,不需要实例化\n\n    func(*sc);  // 需要实例化,传递给函数func的是一个Graphics\u003Cchar>对象\n\n    auto iobj = sizeof(Graphics\u003Cstd::string>);  // 需要实例化,因为sizeof会计算Graphics\u003Cstring>对象的大小,\n                                                // 为了计算大小,编译器必须根据类模板定义产生该类型。\n    return 0;\n}\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n类模板的成员函数\n类模板的成员函数可以在类模板的定义中定义(inline函数),也可以在类模板定义之外定义(此时成员函数定义前面必须加上template及模板参数)\n类模板成员函数本身也是一个模板,类模板被实例化时它并不自动被实例化,只有当它被调用或取地址,才被实例化\n类中的虚函数不能用类型参数模板\ntemplate \u003Ctypename T>\nclass Graphics {\npublic:\n    Graphics() {}\n    // 成员函数定义在类模板的定义中\n    void print() {}\n\n    // 类中的虚函数不能用类型参数模板\n    // template \u003Ctypename U>\n    // virtual void func(U value) {\n    // \n    // }\nprivate:\n    T m_value;\n};\n\n// 成员函数定义在类模板定义之外\ntemplate \u003Ctypename T>\nvoid Graphics\u003CT>::print()\n{\n}\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n普通类的成员函数模板\n#include \u003Ciostream>\n// 普通类\nclass MyTest {\npublic:\n    // 成员函数模板\n    template \u003Ctypename U>\n    void func(U val)\n    {\n        std::cout \u003C\u003C \"type=\" \u003C\u003C typeid(val).name() \u003C\u003C \" value:\" \u003C\u003C val \u003C\u003C std::endl;\n    }\n};\n\nint main()\n{\n    MyTest test;\n    test.func(100); // 普通类的成员函数模板:自动类型推导为int\n    test.func(10.0);// 普通类的成员函数模板:自动类型推导为double\n    return 0;\n}\n// 输出\n// type=i value:100\n// type=d value:10\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n类模板的成员函数模板\n#include \u003Ciostream>\n\n// 类模板\ntemplate \u003Ctypename T>\nclass MyTest {\npublic:\n    MyTest(T val) : m_val(val) {}\n    // 普通成员函数\n    void print()\n    {\n        std::cout \u003C\u003C \"print() type=\" \u003C\u003C typeid(m_val).name() \u003C\u003C \" m_val:\" \u003C\u003C m_val \u003C\u003C std::endl;\n    }\n    // 成员函数模板\n    template \u003Ctypename U>\n    void func(U val)\n    {\n        std::cout \u003C\u003C \"template type=\" \u003C\u003C typeid(val).name() \u003C\u003C \" value:\" \u003C\u003C val \u003C\u003C std::endl;\n    }\n\nprivate:\n    T m_val;\n};\n\nint main()\n{\n    MyTest\u003Cint> test(100);  // 类模板实例化,显示指定类型T-> int\n    test.print();\n    test.func(10.0);  // 类模板的成员函数模板,自动推导出U-> double\n\n    MyTest\u003Cdouble> test1(100.0);  // 类模板实例化,显示指定类型T-> double\n    test1.print();\n    test1.func(10);  // 类模板的成员函数模板,自动推导出U-> int\n\n    return 0;\n}\n// 输出\n// print() type=i m_val:100化:对于全特化,类的所有参数都与模板类的所有参数一一对应\n\n普通成员函数全特化\n静态成员变量全特化\ntemplate \u003Ctypename T, typename U>\nstruct MyTest\n{\n    MyTest()\n    {\n        std::cout \u003C\u003C \"类模板泛化\" \u003C\u003C std::endl;\n    }\n\n    void func()\n    {\n        std::cout \u003C\u003C \"func函数泛化\" \u003C\u003C std::endl;\n    }\n    static  int  m_value;// 静态成员变量\n};\n\n// 普通成员函数全特化\ntemplate \u003C>\nvoid MyTest\u003Cint, double>::func()\n{\n    std::cout \u003C\u003C \"func全特化\" \u003C\u003C std::endl;\n}\n\ntemplate\u003Ctypename T, typename U>\nint MyTest\u003CT, U>::m_value = 10;\n\n// 静态成员函数全特化\ntemplate\u003Ctypename T, typena

【无标题】类模板详解\n类模板的定义及实例化\ntemplate\u003Cclass 模板参数>\nclass 类名 {\n // 类定义\n};\n\ntemplate\u003Ctypen相关推荐

  1. 类模板详解\n类模板的定义及实例化 模板参数

    类模板详解\n类模板的定义及实例化\ntemplate\u003Cclass 模板参数>\nclass 类名 {\n    // 类定义\n};\n\ntemplate\u003Ctypenam ...

  2. 新闻类APP模板详解(android版)

    1.概述 本文将介绍一个android版新闻类app模板,是本人整合了网上各类资源后整理出来的,希望对大家有所帮助! iOS版新闻类app模板详见: 新闻类APP模板详解(iOS版) 本模板app截图 ...

  3. sstream类的详解

     sstream类的详解             sstream类详细介绍 C++引入了ostringstream.istringstream.stringstream这三个类,要使用他们创建对象 ...

  4. java uml类图教程_Java利器之UML类图详解

    原标题:Java利器之UML类图详解 (点击上方公众号,可快速关注) 来源:伯乐在线专栏作者- Code4Android 如需转载,发送「转载」二字查看说明 前言 UML(Unified Modeli ...

  5. ios开发读取剪切板的内容_iOS中管理剪切板的UIPasteboard粘贴板类用法详解

    一.自带剪切板操作的原生UI控件在iOS的UI系统中,有3个控件自带剪切板操作,分别是UITextField.UITextView与UIWebView.在这些控件的文字交互处进行长按手势可以在屏幕视图 ...

  6. numberformat java_Java NumberFormat 类的详解及实例

    Java NumberFormat 类的详解及实例 概要: NumberFormat 表示数字的格式化类, 即:可以按照本地的风格习惯进行数字的显示. 此类的定义如下: public abstract ...

  7. qml学习笔记(二):可视化元素基类Item详解(上半场anchors等等)

    原博主博客地址:http://blog.csdn.net/qq21497936 本文章博客地址:http://blog.csdn.net/qq21497936/article/details/7851 ...

  8. .net System.Web.Caching.Cache缓存类使用详解(转载)

    转自:http://www.cnblogs.com/virusswb/articles/1681561.html net System.Web.Caching.Cache缓存类使用详解 System. ...

  9. Java记录 -22- Java的基类Object详解

    Java的基类Object详解 Java的JDK文档要经常查阅使用,最好查看英文的文档. Oracle官方在线 Java API Specifications http://www.oracle.co ...

最新文章

  1. 数据公钥加密和认证中的私钥公钥
  2. fatal error C1189: #error:MFC does not support WINVER less than 0x0501. Please change the definitio
  3. Java程序编译和运行的过程
  4. 337. House Robber III 打家劫舍 III
  5. 2021“MINIEYE杯”中国大学生算法设计超级联赛(2)I love exam(背包)
  6. [我研究]Behavior Based Software Theft Detection - Hawk
  7. 前端学习(2669): vue3.0实战开始建立新项目
  8. windows下使用Caffe框架和matlab实现SRCNN官方代码的步骤
  9. CentOS7.4中搭建lnmp环境
  10. delphi idtcpclient和idtcpserver的心跳包
  11. [转载] 初学者python笔记(字符串用法解析)
  12. phpbb简体中文语言包的安装
  13. SSIS ODBC方式连接mysql数据库、oracle数据库
  14. Python——批量发送邮件(持续更新)
  15. DockOne微信分享(六十六): Docker网络方案初探
  16. php设置Apache虚拟主机vhost
  17. android原生系统 抽屉,Android N或取消原生应用抽屉
  18. 五、NLP聊天语料处理
  19. 【BJOI2019】勘破神机(下降幂转自然幂)(第一类斯特林数)(特征方程)
  20. 关于CPU 和 GPU

热门文章

  1. 影刀rpa办公实例一,汇总报名表
  2. WebStorm设置前端开发代码规范
  3. hive中insert插入一条记录报错,跪求高人指点!!!
  4. win10浏览器打字不出选字框解决办法
  5. python 卡方检验批量筛选_用python和Excel进行列联表分析(卡方检验)
  6. 格式为yyyy-MM-dd HH:mm:ss 时间格式
  7. 京瓷4501i打印机扫描步骤_京瓷TASKalfa4501i说明书
  8. 【实战练习】汽油辛烷值优化建模(一)(题目+数据集)
  9. 汽车「内外饰零部件」机器人加工工艺技术方案
  10. 小米怎么和计算机连接网络连接网络,小米电脑连不上无线网_小米电脑连不上网络...