C++ template用法案例詳解
有必要記一下這種一眼看上去就很高級的用法。還是編程不夠多。都沒用過這個。
相信用過c++的人,即便沒用過,也肯定都聽說過模板類這個詞。嗨不巧了,今天講的就是模板類。
模板是c++支持參數(shù)化多態(tài)的工具,使用模板可以使用戶為類或者函數(shù)聲明一種一般模式,使得類中的某些數(shù)據(jù)成員或者成員函數(shù)的參數(shù)、返回值取得任意類型。因此可以說,模板是一種對類型進行參數(shù)化的工具。
template<class T> 和 template<typename T> 都可以用來定義函數(shù)模板和類模板,在使用上,他們倆沒有本質(zhì)的區(qū)別。
函數(shù)模板針對僅參數(shù)類型不同的函數(shù);類模板針對僅數(shù)據(jù)成員和成員函數(shù)類型不同的類。
Note:模板的聲明或定義只能在全局,命名空間或類范圍內(nèi)進行。不能再局部范圍,函數(shù)內(nèi)進行。
一、函數(shù)模板
template< class 形參名,class 形參名,......> 返回類型 函數(shù)名(參數(shù)列表) { 函數(shù)體 }
舉個例子:template <class T> void swap(T& a,T& b){}
當(dāng)調(diào)用這樣的模板函數(shù)時,類型T就會被調(diào)用時的類型所代替。如果swap(a, b),a,b都是int類型,那么模板函數(shù)swap中的形參T就會被int所代替,模板函數(shù)就會變成swap(int &a,int &b)。而當(dāng)swap(a,b),a,b都是double類型,那么模板函數(shù)swap中的形參T就會被double所代替,模板函數(shù)就會變成swap(double &a,double &b),這樣如果我們的程序中交換變量的值就不再受限于類型了。
二、類模板
template< class 形參名,class 形參名,......> class 類名 {...};
舉個例子:template <class T> class A { public: T a; T b; T hy(T c, T &d); };
在類A中聲明了兩個類型為T的成員變量a和b,還聲明了一個返回類型為T帶兩個參數(shù)類型為T的函數(shù)hy。
不講太難的,恩太難的我也不會啊。就寫個簡單的例子把,對我足夠了:
TemplateDemo.h
#ifndef TEMPLATE_DEMO_HXX #define TEMPLATE_DEMO_HXX template<class T> class A{ public: T g(T a,T b); A(); }; #endif
TemplateDemo.cpp
#include<iostream.h> #include "TemplateDemo.h" template<class T> A<T>::A(){} template<class T> T A<T>::g(T a,T b){ return a+b; } void main(){ A<int> a; cout<<a.g(2,3.2)<<endl;
-----------------------------------------------------------------以下可不看-----------------------------------------
現(xiàn)在再看的Kinect的那個代碼:
stdafx.h
template<class Interface> inline void SafeRelease(Interface *& pInterfaceToRelease) { if (pInterfaceToRelease != NULL) { pInterfaceToRelease->Release(); pInterfaceToRelease = NULL; } }
很顯然是聲明了函數(shù)模板,Interface是一種自定義的類型:
BodyBasics.cpp
#include "stdafx.h" ... CBodyBasics::~CBodyBasics() { DiscardDirect2DResources(); // clean up Direct2D SafeRelease(m_pD2DFactory); // done with body frame reader SafeRelease(m_pBodyFrameReader); // done with coordinate mapper SafeRelease(m_pCoordinateMapper); // close the Kinect Sensor if (m_pKinectSensor) { m_pKinectSensor->Close(); } SafeRelease(m_pKinectSensor); }
很顯然ID2D1Factory是一個接口。
-----------------------------------------END-------------------------------------------------
參考博客:https://www.cnblogs.com/yuzhuwei/p/4171070.html
https://blog.csdn.net/biu__biu_biu/article/details/78020620
到此這篇關(guān)于C++ template用法案例詳解的文章就介紹到這了,更多相關(guān)C++ template用法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
dev-c++創(chuàng)建lib(靜態(tài)鏈接庫)文件的實現(xiàn)步驟
本文主要介紹了dev-c++創(chuàng)建lib(靜態(tài)鏈接庫)文件的實現(xiàn)步驟,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06