1. //############################################################################
  2. /*
  3. * 模板介绍
  4. */
  5. //函数模板
  6. template<typename T>
  7. T square(T x) {
  8. return x*x;
  9. }
  10. //类模板
  11. template<typename T>
  12. class BoVector {
  13. T arr[1000];
  14. int size;
  15. public:
  16. BoVector():size(0) {}
  17. void push(T x) { arr[size] = x; size++; }
  18. T get(int i) const { return arr[i]; }
  19. int getSize() const { return size; }
  20. //void print() const {for(int i=0; i<size; i++) {cout << arr[i] << endl;}}
  21. void print() const {
  22. const int* p = arr;
  23. for(int i=0; i<size; i++) {cout << *(p++) << endl;}
  24. }
  25. };
  26. template<typename T>
  27. BoVector<T> operator*(const BoVector<T>& rhs1, BoVector<T>& rhs2) {
  28. BoVector<T> ret;
  29. for (int i=0; i<rhs1.getSize(); i++) {
  30. ret.push(rhs1.get(i)*rhs2.get(i));
  31. }
  32. return ret;
  33. }
  34. int main()
  35. {
  36. cout << square(5) << endl;
  37. BoVector<int> bv;
  38. bv.push(2);
  39. bv.push(5);
  40. bv.push(8);
  41. bv.push(9);
  42. bv.print();
  43. cout << "Print squared bv: " << endl;
  44. bv = square(bv);
  45. bv.print();
  46. }
  47. //############################################################################
  48. /*
  49. * 函数模板类型省略
  50. */
  51. template<class T>
  52. void f() {
  53. ...
  54. }
  55. int main() {
  56. f<int>(); // T显式指定
  57. }
  58. // 类型T可以省略
  59. template<class T>
  60. void f(T t) {
  61. ...
  62. }
  63. int main() {
  64. f(67); // 编译将其绑定为int型
  65. f<long>(67); // 显示告诉编译器为long类型
  66. f(67L);
  67. }
  68. //############################################################################
  69. /*
  70. * 关键字typename及其用法
  71. */
  72. template<class T>
  73. void printAge(T& item) {
  74. ...
  75. }
  76. template<typename T>
  77. void printAge(T& item) {
  78. ...
  79. }
  80. //用于模板参数两者等效
  81. //使用typename更易理解
  82. //
  83. /*
  84. * Dependent Type 取决于模板参数的类型
  85. */
  86. template<typename T> A {
  87. vector<T> vec;
  88. }
  89. /*
  90. * Nested Dependent Type 包含在某个类里的dependent type
  91. */
  92. template<typename T> A {
  93. T::age myAge = 9;
  94. vector<T>::iterator itr;
  95. }
  96. /*
  97. * typename 用法二
  98. */
  99. class Dog {
  100. public:
  101. typedef int age;
  102. };
  103. template<class T>
  104. void printMyAge(T& item) {
  105. int n = 9;
  106. T::age* a = &n;
  107. cout << (*a) << endl;
  108. }
  109. int main() {
  110. Dog d;
  111. printMyAge<Dog>(d);
  112. }
  113. // 上面的代码编译不过,T::age是类型,编译器当成变量
  114. //class Wolf {
  115. // public:
  116. // int age;
  117. //};
  118. /*
  119. * 法则: 当使用嵌套依赖类型的时候总是在前面加上typename,告诉编译器这是类型
  120. */
  121. // 例外: 在基类列表或者初始化列表中
  122. template<typename T>
  123. class D : public T::NestedBaseClass {
  124. public:
  125. D(int x) : T::NestedBaseClass(x) {
  126. typename T::NestedBaseClass y;
  127. ...
  128. }
  129. }
  130. //############################################################################
  131. /*
  132. * 模板特化和偏特化
  133. */
  134. // std是一个特殊的命名空间,我们不能更改它的内容,但是可以为我们的类型提供特化的版本

C++进阶--模板及关键字typename的更多相关文章

  1. 从零开始学C++之模板(三):缺省模板参数(借助标准模板容器实现Stack模板)、成员模板、关键字typename

    一.缺省模板参数 回顾前面的文章,都是自己管理stack的内存,无论是链栈还是数组栈,能否借助标准模板容器管理呢?答案是肯定的,只需要多传一个模板参数即可,而且模板参数还可以是缺省的,如下: temp ...

  2. 缺省模板参数(借助标准模板容器实现Stack模板)、成员模板、关键字typename

    一.缺省模板参数 回顾前面的文章,都是自己管理stack的内存,无论是链栈还是数组栈,能否借助标准模板容器管理呢?答案是肯定的,只需要多传一个模板参数即可,而且模板参数还可以是缺省的,如下: temp ...

  3. C++ - 模板(template)中typename的使用方法

    声明template参数时, 前缀关键字class和typename可以互换; 使用关键字typename标识嵌套从属类型名称, 但不需在基类列表和成员初始化列表内使用. 从属名称(dependent ...

  4. C++ 进阶 模板和STL

    C++提高编程 本阶段主要针对C++泛型编程和STL技术做详细讲解,探讨C++更深层的使用 1 模板 1.1 模板的概念 模板就是建立通用的模具,大大提高复用性 模板的特点: 模板不可以直接使用,它只 ...

  5. Java进阶1. Synchronized 关键字

    Java进阶1. Synchronized 关键字 20131025 1.关于synchronized的简介: Synchronized 关键字代表对这个方法加锁,相当于不管那一个线程,运行到这个方法 ...

  6. C++ 类模板四(typename关键字)

  7. [转] 关于C++中模板中的typename和class的区别比较

    C++箴言:理解typename的两个含义 转自http://blog.csdn.net/dick_china/article/details/4522253 问题:在下面的 template dec ...

  8. OpenCV不同类型Mat的at方法访问元素时该如何确定模板函数的typename(转)

    自从OpenCV推出了Mat后越来越像是Matlab了,使用起来方便了很多,但是,在用at方法访问Mat时,如何选用合适的typename类型来访问相应的Mat元素是个头疼的问题. 比如: int H ...

  9. ansible进阶模板和角色使用

    使用场景 Ansible 由于采用ssh远程连接登录管理,虽然不需要额外安装agent,但是速度慢效率低.不适合管理大规模的主机一般最大规模在200-300台,超大规模的主机管理适合使用puppet ...

随机推荐

  1. supervisor-program配置

    [program:check_server_state]directory=/sunlight/shellcommand=/usr/bin/sh check_server_state.shautost ...

  2. 将scrapy项目运行在pycharm中

    1.在scrapy项目中创建一个py脚本,且尽量在scrapy.cfg同级目录下.我创建的是begin.py 2.配置begin.py.写上这一句就相等于一点开始,就在终端上输入了scrapy cra ...

  3. Codeforces483B. Friends and Presents(二分+容斥原理)

    题目链接:传送门 题目: B. Friends and Presents time limit per test second memory limit per test megabytes inpu ...

  4. weixin-java-mp集成微信公众号自带客服功能

    电脑端登录公众号管理后台,[添加功能插件]开通客服功能,输入"人工客服"接入客服热线 底部有我的微信二维码,如有问题,可加好友进行技术交流! ​ ​ ​ ​ ​ ​ ​ weixi ...

  5. C# 敏捷1

    using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; ...

  6. 【BZOJ4552】【TJOI2016】【HEOI2016】排序

    经验还是不够…… 原题: 在2016年,佳媛姐姐喜欢上了数字序列.因而他经常研究关于序列的一些奇奇怪怪的问题,现在他在研究一个难题 ,需要你来帮助他.这个难题是这样子的:给出一个1到n的全排列,现在对 ...

  7. 更改MySQL数据库的编码为utf8mb4

    原文:http://blog.csdn.net/woslx/article/details/49685111 utf-8编码可能2个字节.3个字节.4个字节的字符,但是MySQL的utf8编码只支持3 ...

  8. nginx日志分割配置实例

    Nginx没有类似Apache的cronolog日志分割处理的功能,但是,可以通过nginxNginx的信号控制功能利用脚本来实现日志的自动切割.请看下面的一个实例.Nginx对日志进行处理的脚本: ...

  9. Unity 官方教程 学习

    Interface & Essentials Using the Unity Interface 1.Interface Overview https://unity3d.com/cn/lea ...

  10. C#模拟键盘按键的三种方式实现

    1.System.Windows.Forms.SendKeys 组合键:Ctrl = ^ .Shift = + .Alt = % 模拟按键:A private void button1_Click(o ...