【C++知識點總結全系列 (07)】:模板與泛型編程詳細總結與分析

模板與泛型編程

  • 1、概述
    • (1)What(什么是模板、泛型編程)
    • (2)Why
    • (3)Which
    • (4)模板參數
      • A.What
      • B.How
      • C.模板參數的類型成員
      • D.默認模板參數
  • 2、模板函數
  • 3、模板類
    • (1)How(如何定義和使用模板類)
    • (2)成員模板
  • 4、模板實參推斷
    • (1)What(什么是模板實參推斷)
    • (2)
  • 5、動態內存分配
  • 6、智能指針模板

1、概述

(1)What(什么是模板、泛型編程)

模板:

模板分為函數模板和類模板,其類內部的類型和函數的形參類型不具體指定,用一個 虛擬的類型來代表,在具體使用的時候在具體化

泛型編程:

以一種獨立于任何特定類型的方式編寫代碼,模板是泛型編程的基礎

(2)Why

實現代碼的重用

(3)Which

  • 模板函數
  • 模板類

(4)模板參數

A.What

模板參數是在 C++ 模板中使用的類型或非類型實體的占位符,分為類型模板參數和非 類型模板參數

B.How

template <typename T> T calc(const T&, const T&); //模板的聲明

注意:通常一個文件所有模板的聲明放在文件的開始位置

C.模板參數的類型成員

  • T::value_type():必須顯式地告訴編譯器該名字是一個類型,且只能使用關鍵字 typename(而非 class)

D.默認模板參數

與函數默認實參一樣,對于一個模板參數,只有當它的右側都有默認參時,它才可以有默認參數

在這里插入圖片描述

2、模板函數

#include <sstream>
using namespace std; 
template <class T>//T 是類型模板參數
string tTostring(T t)
{std::ostringstream osstream; osstream << t;return osstream.str(); 
}template <typename T, typename U>//模板參數列表 
auto add(T t, U u){if constexpr (std::is_same<T, std::string>::value)return t + tTostring(u);if constexpr (std::is_same<U, std::string>::value)return tTostring(t) + u;if constexpr (std::is_arithmetic<T>::value && std::is_arithmetic<U>::value)return t + u;
}

3、模板類

(1)How(如何定義和使用模板類)

template <class T> 
class Blob {
public: 
typedef typename std::vector<T>::size_type size_type;
private:
std::vector<T> *data_; void check(size_type i, const std::string &msg) const; public:
Blob(){ data_ = new std::vector<T>();} 
Blob(std::initializer_list<T> il)
{ 
data_ = new std::vector<T>(il); 
} 
Blob(const Blob &blob) {//在一個類模板作用域內,可直接使用模板名,而不必指定模板參數
data_ = new std::vector<T>(*blob.getData());
// 也可 blob.data_,在類的成員函數內部,可直接訪問同類的其他對象私有成員 }
~Blob()
{ 
delete data_;
}
std::vector<T> *getData() const
{
return data_;
} 
size_type size() const 
{return data_->size(); 
} 
bool empty() const 
{ return data_->empty(); 
} 
void push_back(const T &t) 
{ data_->push_back(t); 
} 
void push_back(T &&t)
{ data_->push_back(std::move(t)); 
} 
};
void main()
{Blob<double> blob; //實例化一個blob對象,用域處理double類型的數據...
}

(2)成員模板

本身是模板函數的成員函數,成員模板不能是虛函數

在這里插入圖片描述

4、模板實參推斷

(1)What(什么是模板實參推斷)

在實例化模板函數或模板類的時候,進行模板實參推斷

(2)

5、動態內存分配

6、智能指針模板

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

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

相關文章

入侵檢測模型

入侵檢測模型&#xff08;Intrusion Detection Model&#xff09;在網絡安全中起著至關重要的作用。它們用于識別和響應未經授權的訪問和攻擊行為。以下是常見的入侵檢測模型的詳細介紹&#xff1a; 一、入侵檢測模型分類 基于簽名的入侵檢測模型&#xff08;Signature-Based …

昇思25天學習打卡營第7天|Pix2Pix實現圖像轉換

文章目錄 昇思MindSpore應用實踐基于MindSpore的Pix2Pix圖像轉換1、Pix2Pix 概述2、U-Net架構定義UNet Skip Connection Block 2、生成器部分3、基于PatchGAN的判別器4、Pix2Pix的生成器和判別器初始化5、模型訓練6、模型推理 Reference 昇思MindSpore應用實踐 本系列文章主要…

大數據面試題之Flink(3)

如何確定Flink任務的合理并行度? Flink任務如何實現端到端一致? Flink如何處理背(反)壓? Flink解決數據延遲的問題 Flink消費kafka分區的數據時flink件務并行度之間的關系 使用flink-client消費kafka數據還是使用flink-connector消費 如何動態修改Flink的配置&a…

實戰:基于Java的大數據處理與分析平臺

實戰&#xff1a;基于Java的大數據處理與分析平臺 大家好&#xff0c;我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編&#xff0c;也是冬天不穿秋褲&#xff0c;天冷也要風度的程序猿&#xff01;今天我們將探討如何利用Java構建高效的大數據處理與分析平臺。…

Python基礎003

Python流程控制基礎 1.條件語句 內置函數input a input("請輸入一段內容&#xff1a;") print(a) print(type(a))代碼執行的時候遇到input函數&#xff0c;就會等鍵盤輸入結果&#xff0c;已回車為結束標志&#xff0c;也就時說輸入回車后代碼才會執行 2.順序執行…

pandas數據分析(5)

pandas使用Numpy的np.nan代表缺失數據&#xff0c;顯示為NaN。NaN是浮點數標準中地Not-a-Number。對于時間戳&#xff0c;則使用pd.NaT&#xff0c;而文本使用的是None。 首先構造一組數據&#xff1a; 使用None或者np.nan來表示缺失的值&#xff1a; 清理DataFrame時&#xf…

深度學習之交叉驗證

交叉驗證&#xff08;Cross-Validation&#xff09;是一種用于評估和驗證機器學習模型性能的技術&#xff0c;尤其是在數據量有限的情況下。它通過將數據集分成多個子集&#xff0c;反復訓練和測試模型&#xff0c;以更穩定和可靠地估計模型的泛化能力。常見的交叉驗證方法有以…

java設計模式(四)——抽象工廠模式

一、模式介紹 改善在工廠方法模式中&#xff0c;擴展時新增產品類、工廠類&#xff0c;導致項目中類巨多的場面&#xff0c;減少系統的維護成本&#xff0c;且一個工廠可以生成多種產品&#xff0c;而不是同一種的產品&#xff0c;比如一個工廠既可以生產鞋子又可以衣服&#…

解決數據庫PGSQL,在Mybatis中創建臨時表報錯TODO IDENTIFIER,連接池用的Druid。更換最新版本Druid仍然報錯解決

Druid版本1.1.9報錯Caused by: java.sql.SQLException: sql injection violation, syntax error: TODO IDENTIFIER : CREATE TEMPORARY TABLE temp_ball_classify (id int8 NOT NULL,create_time TIMESTAMP,create_by VARCHAR,classify_name VARCHAR) 代碼如下&#xff1a; 測…

四川蔚瀾時代電子商務有限公司打造抖音電商服務新高地

在數字化浪潮洶涌澎湃的今天&#xff0c;電商行業以其獨特的魅力和強大的市場潛力&#xff0c;成為了推動經濟增長的新引擎。四川蔚瀾時代電子商務有限公司&#xff0c;作為這個領域的佼佼者&#xff0c;正以其專業的服務、創新的理念和卓越的實力&#xff0c;引領抖音電商服務…

用AI,每天創作200+優質內容,2分鐘教會你操作!

前段時間發布了這篇“尋找爆款文案及標題的9大渠道&#xff0c;直接搬運都能搞流量&#xff01;”&#xff0c;里面我講到如何尋找爆款標題。最近不少朋友問我&#xff0c;如何創作這個標題相關的內容。 多數平臺都有風控規則&#xff0c;有些平臺內容也會有字數要求。為了讓大…

SpringBoot 項目整合 MyBatis 框架,附帶測試示例

文章目錄 一、創建 SpringBoot 項目二、添加 MyBatis 依賴三、項目結構和數據庫表結構四、項目代碼1、application.yml2、TestController3、TbUser4、TbUserMapper5、TestServiceImpl6、TestService7、TestApplication8、TbUserMapper.xml9、MyBatisTest 五、瀏覽器測試結果六、…

JavaScript實現時鐘計時

會動的時鐘 1.目標 2.分析 1.最開始頁面不顯示時間&#xff0c;有兩個按鈕 開始 暫停。開始按鈕是可以點擊的&#xff0c;暫停按鈕不能點擊 2.當點擊開始按鈕后&#xff0c;設置開始按鈕不可用&#xff0c;暫停按鈕可用。然后將當前系統時間放到按鈕上面。每隔1秒中更新一下…

TransMIL:基于Transformer的多實例學習

MIL是弱監督分類問題的有力工具。然而&#xff0c;目前的MIL方法通常基于iid假設&#xff0c;忽略了不同實例之間的相關性。為了解決這個問題&#xff0c;作者提出了一個新的框架&#xff0c;稱為相關性MIL&#xff0c;并提供了收斂性的證明。基于此框架&#xff0c;還設計了一…

3.js - 反射率(reflectivity) 、折射率(ior)

沒啥太大的感覺 反射率 reflectivity 概念 反射率&#xff1a;指的是&#xff0c;材質表面反射光線的能力反射率&#xff0c;用于控制材質對環境光&#xff0c;或光源的反射程度反射率越高&#xff0c;材質表面反射的光線越多&#xff0c;看起來就越光亮使用 適用于&#xff0…

【OCPP】ocpp1.6協議第5.1章節Cancel Reservation的介紹及翻譯

目錄 5.1 取消預約Cancel Reservation-概述 Cancel Reservation CancelReservation.req 請求消息 CancelReservation.conf 確認消息 取消預定的流程 應用場景 示例消息 CancelReservation.req 示例 CancelReservation.conf 示例 總結 5.1 取消預約Cancel Reservation…

VScode 常用插件

基礎開發插件 Chinese (Simplified)&#xff08;簡體中文語言包&#xff09;&#xff1a;這是適用于VS Code的中文&#xff08;簡體&#xff09;語言包&#xff0c;適用于英語不太流利的用戶。Auto Rename Tag&#xff1a;這個插件可以同步修改HTML/XML標簽&#xff0c;當用戶修…

【PYG】Cora數據集分類任務計算損失,cross_entropy為什么不能直接替換成mse_loss

cross_entropy計算誤差方式&#xff0c;輸入向量z為[1,2,3]&#xff0c;預測y為[1]&#xff0c;選擇數為2&#xff0c;計算出一大坨e的式子為3.405&#xff0c;再用-23.405計算得到1.405MSE計算誤差方式&#xff0c;輸入z為[1,2,3]&#xff0c;預測向量應該是[1,0,0]&#xff0…

Dify入門指南

一.Dify介紹 生成式 AI 應用創新引擎&#xff0c;開源的 LLM 應用開發平臺。提供從 Agent 構建到 AI workflow 編排、RAG 檢索、模型管理等能力&#xff0c;輕松構建和運營生成式 AI 原生應用&#xff0c;比 LangChain 更易用。一個平臺&#xff0c;接入全球大型語言模型。不同…

CesiumJS【Basic】- #050 繪制掃描線(Primitive方式)

文章目錄 繪制掃描線(Primitive方式)- 需要自定義著色器1 目標2 代碼2.1 main.ts繪制掃描線(Primitive方式)- 需要自定義著色器 1 目標 使用Primitive方式繪制掃描線 2 代碼 2.1 main.ts import * as Cesium from cesium;const viewer = new Cesium.Viewer(cesiumConta…