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

EasyC++模板顯式具體化

 更新時間:2021年12月17日 08:45:14   作者:梁唐  
這篇文章主要介紹了C++模板顯式具體化,在C++中,可以提供一個具體化函數(shù)定義稱為具體顯式化(explict?specialization)。其中包含所需的代碼,當編譯器找到與函數(shù)調用匹配的具體化定義時,將使用該定義,而不再尋找模板,下面我們來看看文章具體介紹吧

1.模板顯式具體化

前文當中說了,模板函數(shù)雖然非常好用,但是也存在一些問題。比如有的操作并不是對所有類型都適用的,針對這種情況C++提供了一個解決方案,就是針對特定類型提供具體化的模板定義。這里的具體可以理解成類型的具體。

我們來看一個C++ Primer當中的例子,假設現(xiàn)在我們有一個結構體叫做job:

struct job {
    string name;
    double salary;
    int floor;
}


對于結構體是可以整體賦值的,所以之前的Swap函數(shù)對它一樣適用。

template <typename T>
void Swap(T &a, T &b) {
    T temp = a;
    a = b;
    b = temp;
}


但我們現(xiàn)在希望在交換結構體的時候,只是交換salaryfloor這兩個字段,把name保持不變。由于我們希望引入邏輯變化,所以直接調用Swap函數(shù)就不可行了。

當然我們可以不用函數(shù)模板,直接重載函數(shù):

void Swap(job &a, job &b) {
    // swap為std自帶的交換函數(shù),在algorithm頭文件中
    swap(a.salary, b.salary);
    swap(a.floor, b.floor);
}


由于C++當中規(guī)定,非函數(shù)模板的優(yōu)先級大于函數(shù)模板,所以我們在對job結構體調用Swap函數(shù)的時候,會優(yōu)先使用這個。

除此之外,我們還可以提供一個具體化的模板函數(shù):

template <> void Swap<job> (job &a, job &b) {
    swap(a.salary, b.salary);
    swap(a.floor, b.floor);
}

這個函數(shù)的寫法看起來有些特殊,我們在函數(shù)類型之前加上了template <>,在函數(shù)名后面又跟上了<job>。它表示的是這是一個函數(shù)模板的顯式具體化,也可以理解成為之前的函數(shù)模板提供一個job類型的版本。C++當中規(guī)定顯式模板函數(shù)的優(yōu)先級高于普通模板函數(shù)。

2.實例化和具體化

關于函數(shù)模板,還有一個很重要的概念,就是實例化。

我們在編寫代碼時,如果只是編寫了函數(shù)模板本身,編譯器是不會為我們生成函數(shù)的定義的。當編譯器使用模板為特定的類型生成函數(shù)定義時,就會得到一個模板的實例。這個概念有點像是Python里的元類,元類的實例是另外一個類。

比如我們定義了一個函數(shù)模板:

template <typename T>
void Swap(T &a, T &b) {
    T temp = a;
    a = b;
    b = temp;
}


當我們調用它,傳入兩個int類型的時候,編譯器就會生成一個實例,這個實例使用的類型是int。當我們使用double類型的參數(shù)又一次調用的時候,編譯器會繼續(xù)生成double類型的實例。這個生成實例的過程是不可見的,所以被稱為隱式實例化。

在早年的C++版本當中只支持隱式實例化,但現(xiàn)在C++允許顯示實例化。也就意味著我們可以手動命令編譯器創(chuàng)建特定的實例,比如Swap<int>() 。語法是通過<>聲明指定模板類型,并且在聲明之前加上關鍵字template,如:

template void Swap<int>(int, int);


這個語法看起來和顯式具體化非常相似,顯式具體化的寫法是:

template<> void Swap<int>(int &, int &);
template<> void Swap(int &, int &);


看起來非常相似,但是含義是完全不同的。顯式具體化的含義是對于某特定類型不要使用原模板生成函數(shù),而應專門使用指定的函數(shù)定義。而顯式實例化是使用之前的模板函數(shù)的定義的,只不過是手動觸發(fā)編譯器創(chuàng)建函數(shù)實例而已。

對了,我們不能同時在一個文件中,使用同一種類型的顯式實例化和顯式具體化,這會引起報錯。

我們如果死記顯式實例化的聲明,的確很容易和具體化混淆。但我們可以在代碼當中直接使用,直接使用的形式則要簡單許多,只需要通過<>表明類型即可。

例如:

template <typename T>
T Add(T a, T b) {
    return a + b;
}

int main() {
 int a = 3;
 double b = 3.5;
 cout << Add<double>(a, b) << endl;
}   


在上面這段代碼當中,我們通過給Add函數(shù)加上了<double>來手動創(chuàng)建了一個接受double類型的函數(shù)。需要注意的是,我們傳入的a是一個int類型。所以編譯器會執(zhí)行強制類型轉換,將它轉換成double傳入。

到此這篇關于C++模板顯式具體化的文章就介紹到這了,更多相關C++模板顯式具體化內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • c語言統(tǒng)計素數(shù)之和的實例

    c語言統(tǒng)計素數(shù)之和的實例

    這篇文章主要介紹了c語言統(tǒng)計素數(shù)之和的實例,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • C語言實現(xiàn)高精度加法的示例代碼

    C語言實現(xiàn)高精度加法的示例代碼

    高精度的本質是將數(shù)字以字符串的形式讀入,然后將每一位分別存放入int數(shù)組中,通過模擬每一位的運算過程,來實現(xiàn)最終的運算效果,下面我們就來看看如何通過C語言實現(xiàn)高精度加法吧
    2023-11-11
  • C語言 文件的隨機讀寫詳解及示例代碼

    C語言 文件的隨機讀寫詳解及示例代碼

    本文主要介紹C語言 文件的隨機讀寫,這里整理了相關資料及示例代碼以便大家學習參考,學習此部分內容的朋友可以參考下
    2016-08-08
  • C++函數(shù)模板的使用詳解

    C++函數(shù)模板的使用詳解

    大家好,本篇文章主要講的是C++函數(shù)模板的使用詳解,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2022-01-01
  • c++ 完備的運行時類型信息(動態(tài)類型信息)

    c++ 完備的運行時類型信息(動態(tài)類型信息)

    這篇文章主要介紹了c++ 完備的運行時類型信息,需要的朋友可以參考下
    2017-07-07
  • vscode 配置 C/C++編譯環(huán)境(完整教程)

    vscode 配置 C/C++編譯環(huán)境(完整教程)

    這篇文章主要介紹了vscode 配置 C/C++編譯環(huán)境(完整教程),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-09-09
  • C++ 網絡連通性檢測的實現(xiàn)方法

    C++ 網絡連通性檢測的實現(xiàn)方法

    這篇文章主要介紹了C++ 網絡連通性檢測的實現(xiàn)方法的相關資料,這里提供實例幫助大家實現(xiàn)這樣的功能,需要的朋友可以參考下
    2017-09-09
  • wxWidgets實現(xiàn)無標題欄窗口拖動效果

    wxWidgets實現(xiàn)無標題欄窗口拖動效果

    這篇文章主要為大家詳細介紹了wxWidgets實現(xiàn)無標題欄窗口拖動效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-02-02
  • 詳解C語言快速排序三種方法的單趟實現(xiàn)

    詳解C語言快速排序三種方法的單趟實現(xiàn)

    本文將通過圖片重點為大家介紹一下C語言中快速排序三種方法的單趟實現(xiàn):分別是hoare法、挖坑法、雙指針法,文中示例代碼講解詳細,感興趣的可以了解一下
    2022-06-06
  • C/C++中棧(stack)&堆(heap)詳解及其作用介紹

    C/C++中棧(stack)&堆(heap)詳解及其作用介紹

    這篇文章主要介紹了C/C++中棧(stack)&堆(heap)詳解及其作用,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-09-09

最新評論

永川市| 屯门区| 黑龙江省| 车致| 平邑县| 衡山县| 怀化市| 淄博市| 西丰县| 卫辉市| 老河口市| 金秀| 霍山县| 贵港市| 博客| 梁山县| 黔西县| 河曲县| 汤原县| 银川市| 图木舒克市| 原阳县| 邵阳市| 永春县| 兴仁县| 岳阳市| 万安县| 塔城市| 定结县| 黄大仙区| 曲阜市| 余庆县| 弋阳县| 庄河市| 张北县| 龙门县| 苍南县| 红桥区| 苗栗县| 理塘县| 犍为县|