<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
模板引數分類型別形參與非型別形參。
型別形參:出現在模板參數列中,跟在class或者typename之類的引數型別名稱。
非型別形參,就是用一個常數作為類(函數)模板的一個引數,在類(函數)模板中可將該引數當成常數來使用。
注意:
有時候,編譯預設函數模板或者類別範本不能正確處理需要邏輯,需要針對一些情況特殊化處理,就要做模板特化。
通常情況下,使用模板可以實現一些與型別無關的程式碼,但對於一些特殊型別的可能會得到一些錯誤的結果,例如:
template<class T> bool IsEqual(const T&left,const T&right) { return left==right; } //針對字串型別要特殊化處理--寫一份函數模板的特殊化出來 template<> bool IsEqual<char*>(const char* &left,const char* &right) { return strcmp(left,right)==0; } int main() { cout<<IsEqual(1,2)<<endl;//0 cout<<IsEqual(1.1,1.1)<<endl;//1 char p1[]="hello"; char p2[]="hello"; cout<<IsEqual(p1,p2)<<endl;//0 const char* p3="hello"; const char* p4="hello"; cout<<IsEqual(p3,p4)<<endl;//1 }
此時,就需要對模板進行特化。即:在原模板類的基礎上,針對特殊型別所進行特殊化的實現方式。模板特化中分為函數模板特化與類別範本特化。
特化的本質:顯示指定範例化的模板
函數模板特化步驟
template<> bool IsEqual<const char* const>(const char* const &left,const char* &right) { if(strcmp(left,right)>0) return true; return false; }
注意:一般情況下如果函數模板遇到不能處理或者處理有誤的型別,為了實現簡單通常都是將該函數直接給出。
全特化既是將模板參數列中所有的引數都確定化
template<calss T1,class T2> class Data { public: Data(){cout<<"Data<T1,T2>"<<endl; } private: T1 _d1; T2 _d2; }; template<> class Data<int ,char> public: Data(){cout<<"Data<int,char>"<<endl; } private: int _d1; char _d2; }; void TestVector() { Data<int,int>d1; Data<int,char>d2; }
針對任何模板引數進一步進行條件限制設計的特化版本,比如對於一下模板類:
template<class T1,class T2> class Data { public: Data(){cout<<"Data<T1,T2>"<<endl;} private: T1 _d1; T2 _d2; }; //偏特化有以下兩種表現方式: //1、部分特化:將函數中的一部分引數特化。 template<class T1> class Data<T1,int> { public: Data(){cout<<"Data<T1,int>"<<endl;} private: T1 _d1; int _d2; } //2、引數進一步的限制:偏特化並不僅僅是指特化部分引數,而是針對模板引數更進一步的條件限制所設計出來的一個特化版本 //兩個引數偏特化為指標型別 template<typename T1,typename T2> class Data<T1*,T2*> { public: Data(){cout<<"Data<T1*,T2*>"<<endl;} private: T1* _d1; T2* _d2; }; //兩個引數偏特化為參照型別 template<typename T1,typename T2> class Data<T1&,T2&> { public: Data(){cout<<"Data<T1&,T2&>"<<endl;} private: const T1& _d1; const T2& _d2; }; void test2() { Data<double,int>d1; //呼叫特化的int版本 Data<int,double>d2; //呼叫基礎模板 Data<int *,int*>d3; //呼叫特化的指標版本 Data<int&,int&>d4(1,2); //呼叫特化的參照版本 }
分離編譯就是指一個程式由若干個原始檔共同實現,而每個原始檔單獨編譯生成目標檔案,最後將目標檔案連線起來形成單一的可執行檔案的過程稱為分離編譯模式。
// a.h template<class T> T Add(const T& left, const T& right); // a.cpp template<class T> T Add(const T& left, const T& right) { return left + right; } // main.cpp #include"a.h" int main() { Add(1, 2); Add(1.0, 2.0); return 0; }
分析:
優點
缺點
到此這篇關於C++ 深入淺出探索模板的文章就介紹到這了,更多相關C++ 模板內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45