到了第二节课了。类模
板
,其实和函数模
板
形式差不多,也是静多态嘛。编译的时候再实例化特定的版本。减少了内存,提高了运行时效率,I think!
不多说了,主要是就三点:类模 板 、模 板 完全特化、模 板 偏特化.
类模 板 :其实也就是指定模 板 参数供类使用,类在实例化的时候再决参数类型。
代码:
main.c
模
板
完全特化:在类的定义时就指定模板参数,就类似特定的需求、特定的定制.
模 板 偏特化: 一半特化,一半保持原始参数.
我也是瞎理解的,毕竟还比较菜。学习ing...
不多说了,主要是就三点:类模 板 、模 板 完全特化、模 板 偏特化.
类模 板 :其实也就是指定模 板 参数供类使用,类在实例化的时候再决参数类型。
代码:
点击(此处)折叠或打开
- #ifndef _CLASS_TEMPLATE_
- #define _CLASS_TEMPLATE_
-
- #include <iostream>
- using namespace std;
-
- /**
- * @brief 类模板【类似于函数模板】
- */
- template <typename T>
- class ClassTpt
- {
- public:
- ClassTpt(T data)
- {
- _data = data;
- }
- ~ClassTpt(){}
- public:
- void showData()
- {
- cout << _data << endl;
- }
- private:
- T _data;
- };
-
- /**
- * @brief 类模板【完全特化】
- */
- ///< 一般人都喜欢晚上做运动...别想歪了哦!玩笑了...
- template <typename T>
- class Evening
- {
- public:
- void doSports()
- {
- cout << "Most people like doing sportsn";
- }
- };
-
- typedef struct somebody
- {
- static char * nameA;
- static char * nameB;
- static char * nameC;
- }SB;
-
- ///< 这里有三个人不仅晚上做运动,而且还看片,嘿嘿....
- ///< 还记得初中英语课本上的Lilei、Han meimei、Lucy&Lily和Polly吗?
- char * SB::nameA = "Lilei";
- char * SB::nameB = "Polly";
- char * SB::nameC = "Han meimei";
-
- ///< 特化某些人,因为他们晚上不仅做运动,还喜欢看片...
- template <>
- class Evening <SB>
- {
- public:
- void doSports()
- {
- cout << SB::nameA << "like doing sportsn";
- cout << SB::nameB << "like doing sportsn";
- cout << SB::nameC << "like doing sportsn";
- }
-
- void watchingMovies()
- {
- cout << SB::nameA << "like watching moviesn";
- cout << SB::nameB << "like watching moviesn";
- cout << SB::nameC << "like watching moviesn";
- }
- };
-
- /**
- * @brief 类模板【偏特化、不难理解,就是部分特化呗】
- */
- class HumanThinking{};
-
- template <typename T>
- //class ApesMonkeys <HumanThinking, T> //NOT OK,为什么,再想想
- class ApesMonkeys
- {
- public:
- void showME()
- {
- cout << "我是猿猴,我有一些人类的思维和自己的特征n";
- }
- };
-
- /**
- * @brief 特化的一些模板默认参数【管景伟】
- */
- template <typename t1, int s, typename t2 = HumanThinking>
- class Eg
- {
- public:
- void dosh()
- {
-
- }
- };
-
-
- #endif //_CLASS_TEMPLATE_
main.c
点击(此处)折叠或打开
- #include "ClassTemplate.h"
- #include <iostream>
- #include <string>
-
- using namespace std;
-
- int main(int argc, char ** argv)
- {
- ///< 类模板
- ClassTpt<int> classTest(5);
- classTest.showData();
- ClassTpt<int>(5).showData();
-
- ///< 完全特化
- Evening<string> doI; ///< 我就喜欢跳绳啥的
- doI.doSports();
-
- Evening<SB> doOth; ///< 某些人喜欢做运动,同时喜欢看电影啥的
- doOth.doSports();
- doOth.watchingMovies();
-
- ///< 对了,管哥还说了。模板也可以作为特化类型 like this:
- ///< Evening< Evening<SB> > doI; doI.doSports();
-
- ///< 模板偏特化
- //TODO
-
- ///< 模板参数默认<可以自己变化>
- Eg<int, 3> eObj;
- eObj.dosh();
-
- getchar();
- return 0;
- }
模 板 偏特化: 一半特化,一半保持原始参数.
我也是瞎理解的,毕竟还比较菜。学习ing...