最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++中的模板template小結(jié)

 更新時(shí)間:2020年03月19日 09:27:43   作者:醉曦  
這篇文章主要介紹了C++中的模板template的相關(guān)知識,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

函數(shù)模板

我們可以把函數(shù)模板當(dāng)做一種特殊的函數(shù),里面的參數(shù)類型可以是任意類型,這樣的話我們就可以減少重復(fù)定義,從而讓這個(gè)函數(shù)模板自動適應(yīng)不同的參數(shù)類型,也就是說函數(shù)可以適應(yīng)多種類型的參數(shù),例如double、int或者類什么的。

C++為了實(shí)現(xiàn)上面的功能,引入了template這個(gè)概念。我們可以把template當(dāng)成是一種特殊的類型參數(shù),并且也可以在函數(shù)里當(dāng)做參數(shù)傳遞,心里面把它當(dāng)做int什么的就行了。

使用類型參數(shù)聲明函數(shù)模板的格式如下所示:

template <class identifier> function_declaration;
template <typename identifier> function_declaration; 
 // 這里使用了typename 當(dāng)做聲明類型參數(shù)

上面聲明函數(shù)模板的格式只有一處不同,那就是classtypename,在這里其實(shí)使用哪一種都沒有區(qū)別,看自己喜歡就行,C++對此也沒有做嚴(yán)格的區(qū)分;

為了更好的說明如何使用函數(shù)模板,便在舉一個(gè)很形象的例子,那就是一個(gè)用來返回較大值的函數(shù),具體寫法如下所示:

template <typename T>
T GetMax(T a, T b)
 return a > b ? a : b;

在上面的短短幾行代碼中我們就創(chuàng)建了一個(gè)函數(shù)模板用來獲取兩個(gè)數(shù)之間較大的那個(gè)數(shù),不難看出T在這里并沒有指明具體的類型,在這我們?nèi)匀豢梢栽谛睦锇阉?dāng)做普通變量處理,返回值也是T。

為了使用我們定義的函數(shù)模板,可以參照統(tǒng)一的函數(shù)模板調(diào)用格式:

function_name<type> (parameters); 
// type就是具體的類型,例如int、double這些,parameters就是函數(shù)里的參數(shù),也是具體類型

所以,如果我們想要實(shí)現(xiàn)獲取兩個(gè)整形值里較大的那個(gè),我們可以傳入int這個(gè)類型之后調(diào)用GetMax函數(shù),具體示例如下:

int x = 4;
int y = 2;

int max = GetMax<int> (x, y); // max = 4

類模板

由于template聲明的類型可以是任意類型,也就是使用的時(shí)候傳入具體的類型就行。所以可以參考上面函數(shù)模板的例子構(gòu)造類模板也是一樣的,在使用這個(gè)類的時(shí)候傳入具體的變量類型就行了。例如下面的類模板定義:

template <typename T>
class MyPair{
 T value[2];
 
 public:
  MyPair(T first, T second)
  {
   value[0] = first;
   value[1] = second;
  }
 };

類模板的示例代碼中定義一個(gè)MyPair類,用來存儲任意類型的兩個(gè)元素,例如doublechar,int等,下面我就給出兩個(gè)示例,分別存儲doubleint類型的變量

MyPair<int> myInt(2, 3); // 存儲兩個(gè)整型值
MyPair<double> myDouble(2.3, 3.43); // 存儲兩個(gè)double值

模板類的成員函數(shù)也可以在類外定義,寫法和函數(shù)模板的寫法是一樣的,具體示例如下所示:

template <class T>
class MyPair {
 T a, b;
 public:
 mypair (T first, T second)
  {a=first; b=second;}
 T Getmax ();
};

template <typename T>
T MyPair<T>::Getmax () // 在類外定義函數(shù), 注意前面的寫法和函數(shù)模板寫法一致
{
 T retval;
 retval = a>b? a : b;
 return retval;
}

模板特化

如果我們想要為類模板定義一個(gè)不同的實(shí)現(xiàn)接口,并且要求需要將特定參數(shù)作為參數(shù)傳遞時(shí),那么我們就可以將該模板特化;

為了更好地說明模板特化,還是舉個(gè)簡單的例子吧。假設(shè)我們定義一個(gè)類mycontainer,這個(gè)類可以存儲一個(gè)任意類型的變量,并且這個(gè)類還有一個(gè)函數(shù)叫做increasement用來將存儲的類型加一。并且,如果這個(gè)類存儲的是一個(gè)char類型的時(shí)候,我們會發(fā)現(xiàn)這個(gè)類對于實(shí)現(xiàn)將其中的成員變量轉(zhuǎn)換為大寫的功能將更加方便,不妨將這個(gè)函數(shù)定義為ToUpper,因此,我們可以為char類型的類模板實(shí)現(xiàn)模板特化,具體的示例代碼如下:

// 模板特化
#include <iostream>
using namespace std;

// 聲明類模板:
template <typename T>
class mycontainer {
 T element;
 public:
 mycontainer (T arg) {element=arg;}
 T increase () {return ++element;}
};

// char類型的模板特化:
template <>
class mycontainer<char> {
 char element;
 public:
 mycontainer(char arg) {element=arg;}
 
 char ToUpper()
 {
  if ((element>='a')&&(element<='z'))
  element+='A'-'a';
  return element;
 }
};

對于上面的模板特化,我們需要幾點(diǎn),注意類模板和模板特化的區(qū)別和聯(lián)系

  • 在類模板的前面加上template <>,這表明是模板特化,也就是是說模板特化都需要加上這句話;
  • 還有一點(diǎn)就是類模板后面使用了<char>參數(shù),這個(gè)特定參數(shù)表示我們將模板類特化程<char>類型;

template的其他用法

除了以template或者class關(guān)鍵字開頭聲明的表示類型的模板參數(shù)之外,template也可以具有其他類型的參數(shù),例如int、double這些參數(shù),就類似于一個(gè)函數(shù)中擁有多個(gè)參數(shù),每個(gè)參數(shù)類型還不一樣。為了更好的說明template的其他用法,不妨參考下面的示例代碼,

#include <iostream>
using namespace std;

template<class T, int N> // 這里除了含有class聲明的類型之外,還擁有一個(gè)int類型
class mysequence {
 T memblock [N];
 public:
 void setmember(int x, T value);
 T getmember(int x);
};

template<class T, int N>
void mysequence<T,N>::setmember(int x, T value) {
 memblock[x]=value;
}

template<class T, int N>
T mysequence<T,N>::getmember(int x) {
 return memblock[x];
}

int main(){
 mysequence<int,5> myints;
 mysequence<double,5> myfloats;
 myints.setmember(0,100);
 myfloats.setmember(3,3.1416);
 cout << myints.getmember(0) << '\n';
 cout << myfloats.getmember(3) << '\n';
 return 0;
}

總結(jié)

到此這篇關(guān)于C++總結(jié)之template的文章就介紹到這了,更多相關(guān)C++總結(jié)之template內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語言開發(fā)之歸并排序詳解及實(shí)例

    C語言開發(fā)之歸并排序詳解及實(shí)例

    這篇文章主要介紹了 C語言開發(fā)之歸并排序詳解及實(shí)例的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • QT打包發(fā)布全流程(圖文教程)

    QT打包發(fā)布全流程(圖文教程)

    本文主要介紹了QT打包發(fā)布全流程,文中通過圖文介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • VC++ 中ListCtrl經(jīng)驗(yàn)總結(jié)

    VC++ 中ListCtrl經(jīng)驗(yàn)總結(jié)

    這篇文章主要介紹了VC++ 中ListCtrl經(jīng)驗(yàn)總結(jié)的相關(guān)資料,需要的朋友可以參考下
    2015-06-06
  • C++實(shí)現(xiàn)LeetCode( 69.求平方根)

    C++實(shí)現(xiàn)LeetCode( 69.求平方根)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode( 69.求平方根),本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C++ Boost Tokenizer使用詳細(xì)講解

    C++ Boost Tokenizer使用詳細(xì)講解

    Boost是為C++語言標(biāo)準(zhǔn)庫提供擴(kuò)展的一些C++程序庫的總稱。Boost庫是一個(gè)可移植、提供源代碼的C++庫,作為標(biāo)準(zhǔn)庫的后備,是C++標(biāo)準(zhǔn)化進(jìn)程的開發(fā)引擎之一,是為C++語言標(biāo)準(zhǔn)庫提供擴(kuò)展的一些C++程序庫的總稱
    2022-11-11
  • 詳解vs2022創(chuàng)建及調(diào)用.lib的方法

    詳解vs2022創(chuàng)建及調(diào)用.lib的方法

    這篇文章主要介紹了vs2022創(chuàng)建及調(diào)用.lib的方法,調(diào)用Lib的原則就是可以讓編譯器找到頭文件和庫文件的目錄,并正確引入,本文給大家詳細(xì)講解需要的朋友可以參考下
    2022-11-11
  • C++使用宏實(shí)現(xiàn)動態(tài)庫加載

    C++使用宏實(shí)現(xiàn)動態(tài)庫加載

    開發(fā)的時(shí)候,有些項(xiàng)目不能靜態(tài)鏈接動態(tài)庫,需要程序運(yùn)行時(shí)加載動態(tài)庫。本文將使用宏來實(shí)現(xiàn)動態(tài)庫的加載,感興趣的小伙伴可以跟隨小編一起了解一下
    2022-12-12
  • C語言實(shí)現(xiàn)控制臺版貪吃蛇游戲

    C語言實(shí)現(xiàn)控制臺版貪吃蛇游戲

    這篇文章主要為大家詳細(xì)介紹了c語言貪吃蛇控制臺版,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • C++實(shí)現(xiàn)defer聲明方法詳解

    C++實(shí)現(xiàn)defer聲明方法詳解

    這篇文章主要介紹了C++實(shí)現(xiàn)defer聲明,在和朋友交談時(shí)候,無意間了解到Go語言的defer,發(fā)現(xiàn)挺有意思的。和智能指針類似,當(dāng)出了作用域后,被defer修飾的操作才會執(zhí)行
    2022-11-11
  • C語言游戲項(xiàng)目球球大作戰(zhàn)實(shí)現(xiàn)流程

    C語言游戲項(xiàng)目球球大作戰(zhàn)實(shí)現(xiàn)流程

    這篇文章主要為大家詳細(xì)介紹了如何用C語言實(shí)現(xiàn)流行游戲球球大作戰(zhàn),文中示例代碼介紹的非常詳細(xì),如果過程中有問題在文末還有視頻講解,感興趣的小伙伴們可以參考一下
    2022-01-01

最新評論

广丰县| 辽阳县| 偏关县| 沂源县| 大埔县| 伊宁市| 卓资县| 襄樊市| 武安市| 安图县| 长寿区| 德格县| 蒙城县| 新闻| 沁水县| 舒城县| 康乐县| 海林市| 新建县| 甘南县| 漠河县| 兴业县| 饶平县| 蒙山县| 资溪县| 正安县| 临沭县| 美姑县| 叙永县| 宁陵县| 高淳县| 山东| 乌兰县| 女性| 浙江省| 张家川| 芒康县| 开封县| 中西区| 内黄县| 张家界市|