【C++】學習筆記——模板進階

文章目錄

  • 十一、模板進階
    • 1. 非類型模板參數
    • 2. 按需實例化
    • 3. 模板的特化
      • 類模板的特化
    • 4. 模板的分離編譯
  • 未完待續


十一、模板進階

1. 非類型模板參數

模板參數分為類型形參和非類型形參類型形參即:出現在模板參數列表中,跟在class或者typename之類的參數類型名稱非類型形參,就是用一個常量作為類(函數)模板的一個參數,在類(函數)模板中可將該參數當成常量來使用

// 第一個形參為類型形參,第二個缺省形參為非類型形參
template<class T, size_t N = 10>
#include<iostream>
using namespace std;template<class T, size_t N>
class arr
{// N可以用來分配初始空間
};int main()
{arr<int, 10> a1;arr<int, 1000> a2;return 0;
}

在C++20之前,只支持整形做非類型模板參數

2. 按需實例化

類模板在實例化這個類的時候,會按需實例化(調用了哪個成員函數就實例化哪個函數) 。

#include<iostream>
using namespace std;template<class T, size_t N>
class arr
{
public:T& operator[](size_t index){// 該函數參數不匹配size(1);return _array[index];}const T& operator[](size_t index)const{return _array[index];}size_t size()const { return _size; }bool empty()const { return 0 == _size; }private:T _array[N];size_t _size;
};int main()
{// 不去調用 operator[] 時,檢查不出來錯誤arr<int, 10> a1;arr<int, 1000> a2;return 0;
}

在這里插入圖片描述
當調用出錯的部分的函數時才能檢查出錯誤:

int main()
{// 不去調用 operator[] 時,檢查不出來錯誤arr<int, 10> a1;arr<int, 1000> a2;// 調用operator[]a1[1];return 0;
}

在這里插入圖片描述

3. 模板的特化

通常情況下,使用模板可以實現一些與類型無關的代碼,但對于一些特殊類型的可能會得到一些錯誤的結果。比如說我們有這樣一個函數模板:

template<class T>
bool less(T left, T right)
{return left < right;
}

該函數模板可以比較大小,但是假如有人錯誤的傳入 地址 當實參,這里必然會出現不確定的結果。如果我們想要傳地址也讓其結果正確的話,我們就可以使用 模板的特化 。特化就是將模板特殊化,在原模板類的基礎上,針對特殊類型所進行特殊化的實現方式。即新增一個特化后的模板。

#include<iostream>
using namespace std;// 函數模板
template<class T>
bool Less(T left, T right)
{return left < right;
}// 特化后的模板
template<>
bool Less<int*>(int* left, int* right)
{return left < right;
}

此時,要是實例化的參數更符合特化就使用特化模板進行實例化,否則使用普通的函數模板進行實例化。

函數模板的特化步驟:

  1. 必須要先有一個基礎的函數模板
  2. 關鍵字template后面接一對空的尖括號<>
  3. 函數名后跟一對尖括號,尖括號中指定需要特化的類型
  4. 函數形參表: 必須要和模板函數的基礎參數類型完全相同,如果不同編譯器可能會報一些奇怪的錯誤。

一般情況下如果函數模板遇到不能處理或者處理有誤的類型,為了實現簡單通常都是將該函數直接給出,即直接實現一個特殊的函數構成重載。

bool Less(Date* left, Date* right)
{return *left < *right;
}

該種實現簡單明了,代碼的可讀性高,容易書寫,因此函數模板不建議特化。

類模板的特化

類模板特化也分為 全特化偏特化
全特化即是將模板參數列表中所有的參數都確定化。偏特化是任何針對模版參數進一步進行條件限制設計的特化版本

template<class 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;
};// 半特化/偏特化
template<class T>
class Data<T, char>     // 不是全特化的特化
{
public:Data(){cout << "Data<T, char>" << endl;}
private:int _d1;char _d2;
};

類模板的偏特化還可以這樣使用:

//兩個參數偏特化為指針類型 
template <class T1, class T2>
class Data<T1*, T2*>
{
public:Data(){cout << "Data<T1*, T2*>" << endl;}
private:T1 _d1;T2 _d2;
};

偏特化并不僅僅是指特化部分參數,而是針對模板參數更進一步的條件限制所設計出來的一個特化版本

4. 模板的分離編譯

模板不建議聲明和定義分離 。當聲明和定義分離時,聲明處有調用,所以知道模板實例化的類型,但是沒有實現功能,定義處沒有調用,可以實現功能但是不知道實例化的類型,所以定義處在編譯時,并不會生成地址,導致鏈接時找不到地址從而產生鏈接錯誤。

在這里插入圖片描述
解決方法有兩種:①模板定義的位置顯式實例化。(這種方法不實用,不推薦使用)②不進行聲明和定義分離,將定義也放在.h頭文件里


未完待續

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/10454.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/10454.shtml
英文地址,請注明出處:http://en.pswp.cn/web/10454.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

掌握SEO優化的關鍵:提升網站排名的秘籍(如何提高網站seo排名)

你是否曾經在搜索引擎上搜索過一個關鍵詞&#xff0c;然后點擊了排在前幾位的網站&#xff1f;如果是&#xff0c;那么你已經體會到了SEO&#xff08;搜索引擎優化&#xff09;的威力。SEO是一項關鍵的網絡營銷策略&#xff0c;它能夠讓你的網站在搜索引擎中獲得更高的排名&…

Apache ECharts

Apache ECharts介紹&#xff1a; Apache ECharts 是一款基于 Javascript 的數據可視化圖表庫&#xff0c;提供直觀&#xff0c;生動&#xff0c;可交互&#xff0c;可個性化定制的數據可視化圖表。 官網地址&#xff1a;https://echarts.apache.org/zh/index.html Apache ECh…

Stable Diffusion寫真完整教程

前言 最近自己對AI非常癡迷&#xff0c;并且今后也會一直在這個領域深耕&#xff0c;所以就想著先入門&#xff0c;因此花時間研究了一番&#xff0c;還好&#xff0c;出了點小成果&#xff0c;接下來給大家匯報一下。 AI繪畫 提到AI繪畫&#xff0c;大家可能立馬會想到made…

A-loam建圖算法

A-LOAM構建3d點云地圖并實時轉存二維柵格地圖 A-loam算法。源代碼用的是velodyne雷達話題&#xff0c;但是現在用rslidar來處理。所以也會遇到另外一個包來轉換相關的數據。 git clone https://github.com/HKUST-Aerial-Robotics/A-LOAM.githttps://github.com/HViktorTsoi/r…

重慶市工程技術生態環境專業職稱申報條件

重慶市工程技術生態環境專業職稱申報條件鏈接重慶市人力資源和社會保障局 重慶市生態環境局關于印發重慶市工程技術生態環境專業職稱申報條件的通知_重慶市人力資源和社會保障局類別基本條件業績成果備注工程師具備博士學位&#xff1b;或具備碩士學位或第二學士學位&#xff0…

cin.ignore()函數和stoll函數

cin.ignore()函數 cin.ignore() 是一個非常實用的函數&#xff0c;主要用于控制輸入流 cin 的行為 cin.ignore(int n 1, char delimiter EOF); n&#xff1a;一個整數參數&#xff0c;表示要忽略的字符數量。默認值是1&#xff0c;意味著只忽略下一個字符。delimiter&#x…

Android 屏幕適配全攻略(下)-百變屏幕無壓力,這才是Android屏幕適配的終極解決方案

在上一篇文章中&#xff0c;我們介紹了Android屏幕適配的基本方法&#xff0c;比如使用限定符資源、圖片適配、矢量圖等。 感興趣的朋友&#xff0c;請前往查閱&#xff1a;Android 屏幕適配全攻略&#xff08;中&#xff09;-從九宮格到矢量圖&#xff0c;揭秘Android多屏幕適…

模擬集成電路(3)----單級放大器(共源極)

模擬集成電路(3)----單級放大器&#xff08;共源極&#xff09; 放大是模擬電路的基本功能 大多數自然模擬信號太小而無法處理需要足夠的信噪比 理想的放大器 線性&#xff1a;無限的幅度和頻率范圍 輸入阻抗無限大 輸出阻抗無限小 共源放大器 共源放大器就是將源極接A…

01面向類的講解

指針指向類成員使用 代碼&#xff1a; #include<iostream> using namespace std;class Test { public:void func() { cout << "call Test::func" << endl; }static void static_func();int ma;static int mb; //不依賴對象 }; void Test::static…

JavaScript 動態網頁實例 —— 事件處理應用

前言 事件處理的應用很廣泛。在事件處理的應用中,鼠標事件的應用是最常用到的。本章給出幾個鼠標事件處理應用的示例,包括:頁面預覽、圖像切換、點亮文本、鼠標跟隨、鼠標感應和禁用鼠標按鍵。在這些示例中,有的可以直接拿來應用,有的則只提供了一種應用的方法,稍加拓展,…

示例十一、聲音傳感器

通過以下幾個示例來具體展開學習,了解聲音傳感器原理及特性&#xff0c;學習聲音傳感器的應用&#xff08;干貨版&#xff09;&#xff1a; 示例十一、聲音傳感器 ino文件源碼&#xff1a; //Arduino C demo void setup() {Serial.begin(9600);pinMode(5, OUTPUT); }void loo…

機器學習-無監督學習

無監督學習是機器學習和人工智能的另一個重要分支&#xff0c;它主要處理沒有標簽的數據集&#xff0c;目的是發現數據中的隱藏模式、結構或異常。無監督學習不依賴于預先定義的輸出&#xff0c;而是讓算法自己揭示數據的本質特征。 無監督學習的過程通常包括以下幾個步驟&…

標準服務器控件

文本類型控件 通常指的是用于輸入或顯示文本的控件。 TextBox&#xff1a;這是最基本的文本輸入控件。它允許用戶在頁面上輸入文本。你可以設置它的屬性來控制其行為&#xff0c;如MaxLength&#xff08;限制輸入的最大字符數&#xff09;、ReadOnly&#xff08;是否只讀&…

【C/C++筆試練習】DNS設置文件、應用層、Dos攻擊、DNS服務、DNS、子網劃分、http狀態、路由設置、TCP連接、HTTP狀態碼、剪花布條、客似云來

文章目錄 C/C筆試練習選擇部分&#xff08;1&#xff09;DNS設置文件&#xff08;2&#xff09;應用層&#xff08;3&#xff09;Dos攻擊&#xff08;4&#xff09;DNS服務&#xff08;5&#xff09;DNS&#xff08;6&#xff09;子網劃分&#xff08;7&#xff09;http狀態&am…

docker01-簡介和概述

什么是docker&#xff1f; 我們現在開發項目是在windows操作系統使用idea開發&#xff0c;本地windows操作系統上有我們項目所需的jdk&#xff0c;mysql&#xff0c;redis&#xff0c;tomcat等環境&#xff0c;如果我們想打包我們的項目到一個別的服務器上&#xff0c;在別的服…

【Apache POI】Apache POI-操作Excel表格-簡易版

Catalog Apache POI-操作Excel表格1. 需求2. 優點3. 缺點4. 應用場景5. 使用方法6. SpringBoot工程中處理Excel表格7. Demo示例 Apache POI-操作Excel表格 1. 需求 大多數項目的在運營過程中&#xff0c;會產生運營數據&#xff0c;如外賣系統中需要統計每日的訂單完成數、每…

SpringBoot實現圖片驗證碼

引入依賴 <dependency><groupId>com.github.whvcse</groupId><artifactId>easy-captcha</artifactId><version>1.6.2</version> </dependency>代碼實現 package com.qiangesoft.captcha.controller;import com.wf.captcha.*…

最少數量線段覆蓋-華為OD

系列文章目錄 文章目錄 系列文章目錄前言一、題目描述二、輸入描述三、輸出描述四、java代碼五、測試用例 前言 本人最近再練習算法&#xff0c;所以會發布一些解題思路&#xff0c;希望大家多指教 一、題目描述 給定坐標軸上的一組線段&#xff0c;線段的起點和終點均為整數…

C++:類與對象—繼承

類與對象—繼承 一、繼承是什么&#xff1f;二、繼承定義三、基類和派生類對象賦值轉換四、繼承中的作用域五、派生類的默認成員函數六、繼承與友元七、繼承與靜態成員八、復雜的菱形繼承及菱形虛擬繼承九、繼承的總結和反思十、考察重點 一、繼承是什么&#xff1f; 繼承(inh…

知識付費系統需要哪些資質要求,教育機構教務工作計劃內容有哪些?

每個培訓教育機構都是由很多人員組成&#xff0c;作為教育機構&#xff0c;老師不必須&#xff0c;是必不可少的&#xff0c;但是除了老師之外還得配備一定數量的銷售人員和教務工作者&#xff0c;教務老師其實也就是搞后勤的&#xff0c;但是是必須的&#xff0c;那么教育機構…