Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2623055
  • 博文数量: 315
  • 博客积分: 3901
  • 博客等级: 少校
  • 技术积分: 3640
  • 用 户 组: 普通用户
  • 注册时间: 2011-05-08 15:32
个人简介

知乎:https://www.zhihu.com/people/monkey.d.luffy Android高级开发交流群2: 752871516

文章分类

全部博文(315)

文章存档

2019年(2)

2018年(1)

2016年(7)

2015年(32)

2014年(39)

2013年(109)

2012年(81)

2011年(44)

分类: C/C++

2013-05-19 01:06:15

    到了第二节课了。类模,其实和函数模形式差不多,也是静多态嘛。编译的时候再实例化特定的版本。减少了内存,提高了运行时效率,I think!

    不多说了,主要是就三点:类模、模完全特化、模偏特化.

    类模:其实也就是指定模参数供类使用,类在实例化的时候再决参数类型。
    代码:

点击(此处)折叠或打开

  1. #ifndef _CLASS_TEMPLATE_
  2. #define _CLASS_TEMPLATE_

  3. #include <iostream>
  4. using namespace std;

  5. /**
  6.  * @brief 类模【类似于函数模
  7.  */
  8. template <typename T>
  9. class ClassTpt
  10. {
  11. public:
  12.     ClassTpt(T data)
  13.     {
  14.         _data = data;
  15.     }
  16.     ~ClassTpt(){}
  17. public:
  18.     void showData()
  19.     {
  20.         cout << _data << endl;
  21.     }
  22. private:
  23.     T _data;
  24. };

  25. /**
  26.  * @brief 类模【完全特化】
  27.  */
  28. ///< 一般人都喜欢晚上做运动...别想歪了哦!玩笑了...
  29. template <typename T>
  30. class Evening
  31. {
  32. public:
  33.     void doSports()
  34.     {
  35.         cout << "Most people like doing sportsn";
  36.     }
  37. };

  38. typedef struct somebody
  39. {
  40.     static char * nameA;
  41.     static char * nameB;
  42.     static char * nameC;
  43. }SB;

  44. ///< 这里有三个人不仅晚上做运动,而且还看片,嘿嘿....
  45. ///< 还记得初中英语课本上的Lilei、Han meimei、Lucy&Lily和Polly吗?
  46. char * SB::nameA = "Lilei";
  47. char * SB::nameB = "Polly";
  48. char * SB::nameC = "Han meimei";

  49. ///< 特化某些人,因为他们晚上不仅做运动,还喜欢看片...
  50. template <>
  51. class Evening <SB>
  52. {
  53. public:
  54.     void doSports()
  55.     {
  56.         cout << SB::nameA << "like doing sportsn";
  57.         cout << SB::nameB << "like doing sportsn";
  58.         cout << SB::nameC << "like doing sportsn";
  59.     }

  60.     void watchingMovies()
  61.     {
  62.         cout << SB::nameA << "like watching moviesn";
  63.         cout << SB::nameB << "like watching moviesn";
  64.         cout << SB::nameC << "like watching moviesn";
  65.     }
  66. };

  67. /**
  68.  * @brief 类模【偏特化、不难理解,就是部分特化呗】
  69.  */
  70. class HumanThinking{};

  71. template <typename T>
  72. //class ApesMonkeys <HumanThinking, T> //NOT OK,为什么,再想想
  73. class ApesMonkeys
  74. {
  75. public:
  76.     void showME()
  77.     {
  78.         cout << "我是猿猴,我有一些人类的思维和自己的特征n";
  79.     }
  80. };

  81. /**
  82.  * @brief 特化的一些模默认参数【管景伟】
  83.  */
  84. template <typename t1, int s, typename t2 = HumanThinking>
  85. class Eg
  86. {
  87. public:
  88.     void dosh()
  89.     {

  90.     }
  91. };


  92. #endif    //_CLASS_TEMPLATE_

main.c

点击(此处)折叠或打开

  1. #include "ClassTemplate.h"
  2. #include <iostream>
  3. #include <string>

  4. using namespace std;

  5. int main(int argc, char ** argv)
  6. {
  7.     ///< 类模
  8.     ClassTpt<int> classTest(5);
  9.     classTest.showData();
  10.     ClassTpt<int>(5).showData();

  11.     ///< 完全特化    
  12.     Evening<string> doI;    ///< 我就喜欢跳绳啥的
  13.     doI.doSports();

  14.     Evening<SB> doOth;        ///< 某些人喜欢做运动,同时喜欢看电影啥的
  15.     doOth.doSports();
  16.     doOth.watchingMovies();

  17.     ///< 对了,管哥还说了。模也可以作为特化类型 like this:
  18.     ///< Evening< Evening<SB> > doI; doI.doSports();

  19.     ///< 模板偏特化
  20.     //TODO

  21.     ///<参数默认<可以自己变化>
  22.     Eg<int, 3> eObj;
  23.     eObj.dosh();

  24.     getchar();
  25.     return 0;
  26. }
    完全特化:在类的定义时就指定模板参数,就类似特定的需求、特定的定制.
    模
偏特化:   一特化,一半保持原始参数.
    我也是瞎理解的,毕竟还比较菜。学习ing...
阅读(2046) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~