C++Primer Plus 第十四章代碼重用:14.4.4 數組模板示例和非類型參數2

14.4.4 數組模板示例和非類型參數

提示:這里可以添加系列文章的所有文章的目錄,目錄需要自己手動添加
例如:第一章 Python 機器學習入門之pandas的使用


提示:寫完文章后,目錄可以自動生成,如何生成可參考右邊的幫助文檔

文章目錄

  • 14.4.4 數組模板示例和非類型參數
  • 模板多功能性14.4.5
    • 1.遞歸使用模板
  • 程序清單 14.18 twod.cpp
    • 2.使用多個類型參數
  • 程序清單 14.19pairs.cpp


模板多功能性14.4.5

可以將用于常規類的技術用于模板類。模板類可用作基類,也可用作組件類,還可用作其他模板的類型參數。例如,可以使用數組模板實現棧模板,也可以使用數組模板來構造數組–數組元素是基于棧模板的棧。即可以編寫下面的代碼:

template<typenameT>or<class T>
class Array
{
private:T entry;};
template <typename Type>
class GrowArray :public Array<Type>{...);// inheritance
template <typename Tp>
class Stack
{
//use an rray<>as a component
Array<Tp> ar;
...
};
Array <Stack<int>>asi;//an array of stacks of int

在最后一條語句中,C++98要求使用至少一個空白字符將兩個>符號分開,以免與運算符>>混淆。C++11不要求這樣做。

1.遞歸使用模板

另一個模板多功能性的例子是,可以遞歸使用模板。例如,對于前面的數組模板定義,可以這樣使用它:

ArrayTP< ArrayTP<int,5>10> twodee;

這使得twodee 是一個包含 10個元素的數組,其中每個元素都是一個包含5個 int 元素的數組。與之等價的常規數組聲明如下:

int twodee[10][5];

請注意,在模板語法中,維的順序與等價的二維數組相反。程序清單14.18使用了這種方法,同時使用 ArayTP模板創建了一維數組,來分別保存這10個組(每組包含5個數)的總數和平均值。方法調用cout.width(2)以兩個字符的寬度顯示下一個條目(如果整個數字的寬度不超過兩個字符)。

程序清單 14.18 twod.cpp

// twod.cpp -- making a 2-d array
#include <iostream>
#include "arraytp.h"
int main(void)
{using std::cout;using std::endl;ArrayTP<int, 10> sums;ArrayTP<double, 10> aves;ArrayTP< ArrayTP<int,5>, 10> twodee;int i, j;for (i = 0; i < 10; i++){sums[i] = 0;for (j = 0; j < 5; j++){twodee[i][j] = (i + 1) * (j + 1);sums[i] += twodee[i][j];}aves[i] = (double) sums[i] / 10;}for (i = 0; i < 10; i++){for (j = 0; j < 5; j++){cout.width(2);cout << twodee[i][j] << ' ';}cout << ": sum = ";cout.width(3);cout  << sums[i] << ", average = " << aves[i] << endl;}cout << "Done.\n";// std::cin.get();return 0;
}

下面是程序清單 14.18所示程序的輸出。在twodee 的10個元素(每個元素又是一個包含5個元素的數組)中,每個元素對應于1行:列出了每個元素包含的值、這些值的總和以及平均值。
在這里插入圖片描述

2.使用多個類型參數

模板可以包含多個類型參數。例如,假設希望類可以保存兩種值,則可以創建并使用Pair 模板來保存兩個不同的值(標準模板庫提供了類似的模板,名為 pair)。程序清單 14.19 所示的小程序是一個這樣的示例。其中,方法 first()const和second()const報告存儲的值,由于這兩個方法返回 Pair 數據成員的引用,因此讓您能夠通過賦值重新設置存儲的值。

程序清單 14.19pairs.cpp

// pairs.cpp -- defining and using a Pair template
#include <iostream>
#include <string>
template <class T1, class T2>
class Pair
{
private:T1 a;T2 b;
public:T1 & first();T2 & second();T1 first() const { return a; }T2 second() const { return b; }Pair(const T1 & aval, const T2 & bval) : a(aval), b(bval) { }Pair() {}
};template<class T1, class T2>
T1 & Pair<T1,T2>::first()
{return a;
}
template<class T1, class T2>
T2 & Pair<T1,T2>::second()
{return b;
}int main()
{using std::cout;using std::endl;using std::string;Pair<string, int> ratings[4] ={Pair<string, int>("The Purpled Duck", 5),Pair<string, int>("Jaquie's Frisco Al Fresco", 4),Pair<string, int>("Cafe Souffle", 5),Pair<string, int>("Bertie's Eats", 3)};int joints = sizeof(ratings) / sizeof (Pair<string, int>);cout << "Rating:\t Eatery\n";for (int i = 0; i < joints; i++)cout << ratings[i].second() << ":\t "<< ratings[i].first() << endl;cout << "Oops! Revised rating:\n";ratings[3].first() = "Bertie's Fab Eats";ratings[3].second() = 6;cout << ratings[3].second() << ":\t "<< ratings[3].first() << endl;// std::cin.get();return 0; 
}

對于程序清單 14.19,需要注意的一點是,在main()中必須使用 Pair<string,int>來調用構造函數,并將它作為 sizeof的參數。這是因為類名是Pair<string,int>,而不是Pair。另外,Pair<char *,double>是另一個完全不同的類的名稱。

3.默認類型模板參數
類模板的另一項新特性是,可以為類型參數提供默認值:template <class Tl,class T2=int>class Topo…;這樣,如果省略T2的值,編譯器將使用int:

Topo<double,double>ml;//Tl is double,T2 is doubleTopo<double>m2;//Tl is double,T2 is int

第16章將討論的標準模板庫經常使用該特性,將默認類型設置為類。雖然可以為類模板類型參數提供默認值,但不能為函數模板參數提供默認值。然而,可以為非類型參數提供默認值,這對于類模板和函數模板都是適用的。


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

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

相關文章

《分析模式》漫談08-單繼承不是“唯一繼承”

DDD領域驅動設計批評文集 做強化自測題獲得“軟件方法建模師”稱號 《軟件方法》各章合集 《分析模式》第2章這一段&#xff1a; 劃線處的single inheritance&#xff0c;2004中譯本的翻譯&#xff1a; 翻譯為“單繼承”&#xff0c;是正確的。 2020中譯本的翻譯&#xff1a…

Java NIO(一) 概述

NIO主要用于以少量線程來管理多個網絡連接&#xff0c;處理其上的讀寫等事件。在大量連接情況下&#xff0c;不管是效率還是空間占用都要優于傳統的BIO。 Java NIO 由以下幾個核心部分組成&#xff1a; Channel Buffer Selector Selector 如果你的應用打開了多個連接&#x…

分頁插件 count有數據,代碼不往下執行

如下:如果打印了sql那么當row>0時會有圖2下面sql詳情的輸出 問題出在了分頁參數上,pageNum為1,并且pageSize>2才能打印出圖二的結果,圖一為pageNum值是0,注意,查詢第一頁,分頁應該傳入的是1而不是0

大數據批處理系統和業務系統是兩種不同類型的系統,它們在目的、設計、功能和使用場景上有所區別

大數據批處理系統和業務系統是兩種不同類型的系統&#xff0c;它們在目的、設計、功能和使用場景上有所區別。以下是大數據批處理系統和業務系統之間的一些主要差異&#xff1a; 1. **目的**&#xff1a; - **大數據批處理系統**&#xff1a;主要用于處理和分析大量數據&am…

MySQL高級1.0

目錄 &#x1f4cc;MySQL存儲過程和函數 ??存儲過程和函數介紹 ??存儲過程的創建和調用 ??存儲過程的查看和刪除 ??存儲過程語法-變量 ??存儲過程語法-if語句 ??存儲過程語法-參數傳遞 ??存儲過程語法-while循環 ??存儲過程語法-存儲函數 &#x1f4…

Linux高并發服務器開發(六)線程

文章目錄 1. 前言2 線程相關操作3 線程的創建4 進程數據段共享和回收5 線程分離6 線程退出和取消7 線程屬性&#xff08;了解&#xff09;8 資源競爭9 互斥鎖9.1 同步與互斥9.2 互斥鎖 10 死鎖11 讀寫鎖12 條件變量13 生產者消費者模型14 信號量15 哲學家就餐 1. 前言 進程是C…

【FFmpeg】avio_open2函數

【FFmpeg】avio_open2函數 1.avio_open21.1 創建URLContext&#xff08;ffurl_open_whitelist&#xff09;1.1.1 創建URLContext&#xff08;ffurl_alloc&#xff09;1.1.1.1 查找合適的protocol&#xff08;url_find_protocol&#xff09;1.1.1.2 為查找到的URLProtocol創建UR…

影響Cache命中率的因素有哪些?

緩存命中率&#xff08;Cache Hit Rate&#xff09;是指處理器訪問緩存時&#xff0c;所需數據已經在緩存中找到的次數與總訪問次數的比例。提高緩存命中率可以顯著提升系統性能&#xff0c;因為緩存訪問速度遠快于主存訪問速度。影響緩存命中率的關鍵因素包括&#xff1a; 1.…

C語言異常處理就機制setjmp()和longjmp()

C語言setjmp()和longjmp()實現異常處理機制。 setjmp() 用于保存當前的程序執行狀態。 longjmp() 用于在后面的某個時刻返回到setjmp()點的狀態。 類似goto。但goto是本地的&#xff0c;只能在函數內部跳轉。 setjmp()和longjmp()是非局部跳轉語句&#xff0c;可在調用棧上&a…

通信系統網絡架構_3.移動通信網絡架構

移動通信網為移動互聯網提供了強有力的支持&#xff0c;尤其是5G網絡為個人用戶、垂直行業等提供了多樣化的服務。以下從業務應用角度給出面向5G網絡的組網方式。 1.5GS與DN互連 5GS&#xff08;5G System&#xff09;在為移動終端用戶&#xff08;User Equipment&#xff0c;…

CSRF的其他防范措施?

一般情況下&#xff0c;我們可以通過各種防護策略來防御CSRF&#xff0c;對于QA、SRE、安全負責人等&#xff0c;我們可以做哪些事情來提升安全性呢&#xff1f; 一、CSRF測試 CSRFTester是一款CSRF漏洞的測試工具&#xff0c;CSRFTester工具的測試原理大概是這樣的&#xff…

BLACKBOX.AI:解鎖開發新紀元,加速編程學習的AI神器!

文章目錄 &#x1f4af;BLACKBOX.AI 官網&#x1f341;1 BLACKBOX.AI 工具使用教程&#x1f341;2 BLACKBOX.AI工具使用界面介紹&#x1f341;3 Chat(聊天)功能&#x1f341;4 Explore (探索)功能&#x1f48e;4.1 Terminal(終端)功能&#x1f48e;4.2 Discover(發現)功能&…

STM32 IWDG(獨立看門狗)

1 IWDG簡介 STM32有兩個看門狗&#xff1a;一個是獨立看門狗&#xff08;IWDG&#xff09;&#xff0c;另外一個是窗口看門狗。獨立看門狗也稱寵物狗&#xff0c;窗口看門狗也稱警犬。本文主要分析獨立看門狗的功能和它的應用。 獨立看門狗用通俗一點的話來解釋就是一個12位的…

關于轉BigDecimal對象時,精度問題

//浮點型數值Double d 0.0003d;//轉BigDecimal對象BigDecimal a new BigDecimal(d);System.out.println(String.format("浮點類型數字:%.4f創建BigDecimal對象并且保留多位小數并且保留多位小數時,精度會變多,結果為%s",d,a.setScale(8, BigDecimal.ROUND_DOWN)));…

format()方法——格式化字符串

自學python如何成為大佬(目錄):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 語法介紹 format()可以對數據進行格式化處理操作&#xff0c;語法如下&#xff1a; format(value, format_spec) format_spec為格式化解釋。當參數…

【計算機畢業設計】092基于微信小程序二手閑置交易市場

&#x1f64a;作者簡介&#xff1a;擁有多年開發工作經驗&#xff0c;分享技術代碼幫助學生學習&#xff0c;獨立完成自己的項目或者畢業設計。 代碼可以私聊博主獲取。&#x1f339;贈送計算機畢業設計600個選題excel文件&#xff0c;幫助大學選題。贈送開題報告模板&#xff…

PostgreSQL的系統視圖pg_stat_archiver

PostgreSQL的系統視圖pg_stat_archiver 在 PostgreSQL 數據庫中&#xff0c;pg_stat_archiver 視圖提供了關于歸檔進程&#xff08;archiver process&#xff09;的統計信息。歸檔進程負責將 WAL&#xff08;Write-Ahead Logging&#xff09;日志文件復制到歸檔存儲&#xff0…

探索區塊鏈:顛覆性技術的崛起

目錄 一、引言 二、區塊鏈技術概述 三、區塊鏈應用場景 四、區塊鏈面臨的挑戰 五、區塊鏈的未來展望 六、結語 一、引言 在數字化浪潮的推動下&#xff0c;區塊鏈技術以其獨特的去中心化、透明性和不可篡改性等特性&#xff0c;正在逐步改變我們的生活。從金融領域到供應…

基于Java的茶文化交流系統【附源碼+LW】

摘 要 計算機網絡發展到現在已經好幾十年了&#xff0c;在理論上面已經有了很豐富的基礎&#xff0c;并且在現實生活中也到處都在使用&#xff0c;可以說&#xff0c;經過幾十年的發展&#xff0c;互聯網技術已經把地域信息的隔閡給消除了&#xff0c;讓整個世界都可以即時通話…

MySQL數據庫存儲引擎

MySQL數據庫存儲引擎 存儲引擎概念 存儲引擎也稱為表類型 通過不同的技術比如說&#xff0c;存儲機制&#xff0c;索引技巧&#xff0c;鎖定水平等等&#xff0c;來提供不同的功能。 查看MySQL支持的存儲引擎 show engines\G&#xff1b; 常用引擎比較 對事務有需求 innodb …