C++新經典模板與泛型編程:策略類模板

策略類模板

在前面的博文中,策略類SumPolicyMinPolicy都是普通的類,其中包含的是一個靜態成員函數模板algorithm(),該函數模板包含兩個類型模板參數。其實,也可以把SumPolicyMinPolicy類寫成類模板—直接把algorithm()中的兩個類型模板參數搬到類定義上面作為類模板的模板參數就可以了。類模板SumPolicyMinPolicy的實現代碼如下。

template<typename sumT,typename T>
struct SumPolicy
{static void algorithm(sumT& sum, const T& value){sum += value;}
};template<typename minT,typename T>
struct MinPolicy
{static void algorithm(minT& min, const T& value){if (min > value)min = value;}
};

當然,同樣要修改funcsum()函數模板,該函數模板的第3個類型模板參數要作出改變,當前第3個類型模板參數的默認值是SumPolicy,這是一個類型,但是,修改后的SumPolicy已經是一個類模板了,所以funcsum()函數模板的第3個模板參數必須是一個模板模板參數。修改后的funcsum()函數模板如下。

// 這里的class也可以寫成typename
template<typename T,typename U = SumFixedTraits<T>,template<class,class> class V = SumPolicy>
auto funcsum(const T* begin, const T* end)
{typename U::sumT sum = U::initValue();for (;;){V<U::sumT, T>::algorithm(sum, *begin);// T時數組成員類型,U是固定萃取類模板,從中可以提取出計算的結果類型(U::sumT)// 以及結果的初值,V是策略類模板,用于實現具體算法(求和,求最小值等)if (begin == end)break;++begin;}return sum;
}

完整且完美的代碼,如下:

#include "killCmake.h"#include<string>using namespace std;template<typename T>
struct SumFixedTraits;template<>
struct SumFixedTraits<char>
{using sumT = int;static sumT initValue() {return 0;}
};template<>
struct SumFixedTraits<double>
{using sumT = double;static sumT initValue() {return 0.0;}
};template<typename T>
struct MinFixedTraits;template<>
struct MinFixedTraits<int>
{// 求最小值,結果類型與元素類型相同即可// 為名字統一,都用sumT這個名字using sumT = int;static sumT initValue(){// 這里給整型最大值,相信任何一個數組元素都不會比這個值更大// 因此可以順利找到數組元素中的最小值return INT_MAX;}
};template<typename sumT,typename T>
struct SumPolicy
{static void algorithm(sumT& sum, const T& value){sum += value;}
};template<typename minT,typename T>
struct MinPolicy
{static void algorithm(minT& min, const T& value){if (min > value)min = value;}
};// 這里的class也可以寫成typename
template<typename T,typename U = SumFixedTraits<T>,template<class,class> class V = SumPolicy>
auto funcsum(const T* begin, const T* end)
{typename U::sumT sum = U::initValue();for (;;){V<typename U::sumT, T>::algorithm(sum, *begin);// T時數組成員類型,U是固定萃取類模板,從中可以提取出計算的結果類型(U::sumT)// 以及結果的初值,V是策略類模板,用于實現具體算法(求和,求最小值等)if (begin == end)break;++begin;}return sum;
}int main()
{int my_int_array1[] = { 10,15,20 };std::cout << funcsum<int, MinFixedTraits<int>, MinPolicy>(& my_int_array1[0], & my_int_array1[2]) << std::endl;return 0;
}

在這里插入圖片描述

萃取技術與策略技術的比較

  1. 之前的博文,學習了萃取(trait)技術,也學習了策略(policy)技術,對于萃取技術,通過范例展示了固定萃取和值萃取;對于策略技術,展示了算法策略。萃取技術和策略技術很相似,注意它們之間的相同與不同之處。
  • (1)兩種技術都像一個中間件一樣,夾在不同的功能代碼之間,使代碼之間的調用(交互)更加靈活。
  • (2)萃取技術傳入一個類型,萃取出另外一個類型或值(注重類型或值);而策略技術是傳入一個類型,萃取出一個算法,或者說是一個不同的功能實現(注重動作或行為)。因此,書寫策略類(類模板)時通常都需要包含成員函數以實現指定的行為。但在實際的項目實現中,也可能會在萃取類中實現某些動作或行為,從這個角度來講,兩種技術有時區分并不是那么明顯。
  • (3)萃取技術一般通過一個類模板來實現,通常包含類模板的泛化版本和多個特化版本。而策略技術用普通類或類模板都可以實現。

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

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

相關文章

【Linux】無法使用 ifconfig 查看系統網絡接口信息,報錯 command not found: ifconfig

問題描述 ifconfig是一個用于配置和顯示系統網絡接口信息的命令行工具。它通常用于Unix、Linux和其他類Unix系統中。 通過ifconfig命令&#xff0c;你可以查看和修改系統中網絡接口的配置信息&#xff0c;包括IP地址、子網掩碼、MAC地址、MTU&#xff08;最大傳輸單元&#x…

javacv踩坑記錄

前一陣學習opencv&#xff0c;發現在做人臉識別的時候遇到一些類庫不存在的情況&#xff0c;查找后發現是由于拓展包沒有安裝完全&#xff08;僅安裝了基礎版&#xff09;。由于網絡的問題&#xff08;初步猜測&#xff09;&#xff0c;始終無法安裝好拓展包。 于是另辟蹊徑&am…

MongoDb數據庫

一、命令交互 1.1 數據庫命令 1.顯示所有數據庫&#xff1a; show dbs 2.切換到指定數據庫&#xff0c;如果沒有則自動創建數據庫 use databaseName 3.顯示當前所在數據庫 db 4.刪除當前數據庫 use 庫名 db.dropDatabase() 1.2 集合命令 1.創建集合 db.createColl…

[文檔級關系抽取|ACL論文]文檔級關系抽取中語言理解的基礎模型

Did the Models Understand Documents? Benchmarking Models for Language Understanding in Document-Level Relation Extraction School of Computer Science, Fudan University | ACL 2023.06 | 原文鏈接 Background 過去的工作大多數都是從單個句子中收獲更多的關系&am…

MongoDB中的$type操作符和limit與skip方法

本文主要介紹MongoDB中的$type操作符和limit與skip方法。 目錄 MongoDB的$type操作符MongoDB的limit方法MongoDB的skip方法 MongoDB的$type操作符 MongoDB中的$type操作符用于檢查一個字段的類型是否與指定的類型相匹配。它可以用于查詢和投影操作。 $type操作符可以與以下數…

php,redis實現一個電影熱度排行榜

要實現電影熱度排行榜&#xff0c;需要記錄每個電影的熱度值&#xff0c;熱度值可以根據不同的算法計算&#xff0c;例如&#xff1a;觀看次數、評分數、評論數等。這里我們以觀看次數為例。 首先&#xff0c;需要使用 Redis 的 Sorted Set 數據結構來存儲電影的熱度值和電影 …

JVS低代碼表單引擎:數據校驗與處理的先鋒

隨著信息技術的迅速發展&#xff0c;數據校驗與處理已經成為了各類應用中不可或缺的一環。尤其是在涉及敏感信息&#xff0c;如密碼處理時&#xff0c;其安全性和準確性顯得尤為重要。JVS低代碼表單引擎提供了強大的文本組件觸發邏輯校驗功能&#xff0c;它能夠在用戶填寫數據的…

截取字符串

輸入一個字符串和一個整數 k &#xff0c;截取字符串的前k個字符并輸出。 數據范圍&#xff1a;字符串長度滿足 1≤n≤1000&#xff0c; 1≤k≤n 輸入描述&#xff1a; 1.輸入待截取的字符串 2.輸入一個正整數k&#xff0c;代表截取的長度 輸出描述&#xff1a;截取后的字符串…

模電·放大電路的分析方法——等效電路法

放大電路的分析方法——等效電路法 晶體管的直流模型及靜態工作點的估算法晶體管共射h參數等效模型 h h h參數等效模型的由來參數的物理意義簡化的h參數等效模型 r b e {r\tiny be} rbe的近似表達式 共射放大電路動態參數的分析電壓放大倍數 A ˙ u \.{A}\tiny u A˙u輸入電阻 …

三種配置Spring程序的方法

1 使用XML文件配置Spring程序 在XML文件中使用bean標簽&#xff0c;將其交給容器管理 class: 指定bean對應的類型的全限定名稱id: 用于指定一個名稱&#xff0c;作為該bean的唯一標識符&#xff0c;如果不需要id&#xff0c;也可不指定該屬性name: 用于指定bean的別名&#x…

【小米電腦管家】安裝使用教程--非小米電腦

安裝說明功能體驗下載資源 Xiaomi HyperOS發布后&#xff0c;小米妙享電腦端獨立版本也走向終點&#xff0c;最新的【小米電腦管家】將會內置妙享實現萬物互聯。那么本篇文章將分享非小米電腦用戶如何繞過設備識別驗證安裝使用【小米電腦管家】實現萬物互聯 安裝說明 1.解壓文…

如何用Python編寫俄羅斯方塊Tetris游戲?

在本文中&#xff0c;我們將用Python代碼構建一個令人驚嘆的項目&#xff1a;俄羅斯方塊游戲。在這個項目中&#xff0c;我們將使用pygame庫來構建游戲。要創建此項目&#xff0c;請確保您的系統中安裝了最新版本的Python。讓我們開始吧&#xff01; Pygame是一組跨平臺的Pyth…

wireshark過濾包小技巧

1、過濾包含某個字符串的數據包&#xff1a; 或者&#xff1a; 2、過濾包含某一連續十六進制的數據包&#xff1a; 或者&#xff1a; 3、過濾精確到位數位置 或者&#xff1a;

關于使用EB tresos出現無法激活的情況解決

EB安裝完成時需要激活才能使用的&#xff0c;不然都無法建立工程。 我在安裝eb studio時就是在激活方面有問題導致無法使用&#xff0c;下面講解出現了什么問題以及我如何去解除的。 1.出現的錯誤提示&#xff1f; ERROR&#xff1a;flexActAPPActivationSend按照在官網中&…

低代碼:輕松構建應用程序的新時代

在當今數字化時代&#xff0c;應用程序對于日常企業業務的開展&#xff0c;已經成為一種剛需。然而&#xff0c;應用程序開發的過程往往耗時耗力&#xff0c;對于企業來講&#xff0c;是一筆不小的成本開支。低代碼問世以來&#xff0c;一直在嘗試為業務人員賦能&#xff0c;讓…

扁平按鈕樣式

上圖 代碼&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>扁平按鈕</title><style>body {margin: 0;padding: 0;height: 100vh;display: flex;justify-content: center;ali…

Web漏洞-XSS繞過和pikachu靶場4個場景(三)

★★實戰前置聲明★★ 文章中涉及的程序(方法)可能帶有攻擊性&#xff0c;僅供安全研究與學習之用&#xff0c;讀者將其信息做其他用途&#xff0c;由用戶承擔全部法律及連帶責任&#xff0c;文章作者不承擔任何法律及連帶責任。 1、XSS漏洞挖掘與繞過 1.1、XSS漏洞挖掘 數據…

排序算法---冒泡排序

1. 原理 對數組進行遍歷&#xff0c;每次對相鄰的兩個元素進行比較&#xff0c;如果大的在前面&#xff0c;則交換兩個元素的位置&#xff0c;完成一趟遍歷后&#xff0c;數組中最大的數值到了數組的末尾。再對前面n-1個數值進行相同的遍歷。一共完成n-1趟遍歷就實現了排序。 1…

代碼隨想錄 63. 不同路徑 II

題目 一個機器人位于一個 m x n 網格的左上角 &#xff08;起始點在下圖中標記為 “Start” &#xff09;。 機器人每次只能向下或者向右移動一步。機器人試圖達到網格的右下角&#xff08;在下圖中標記為 “Finish”&#xff09;。 現在考慮網格中有障礙物。那么從左上角到右下…

UI界面程序鼠標右鍵彈出菜單的一些事

1.概述 在做客戶端UI程序時&#xff0c;鼠標右鍵彈出菜單這種操作非常常見&#xff0c;一般在鼠標右鍵按下或者鼠標右鍵抬起事件中響應操作&#xff0c;顯示菜單即可&#xff0c;但是有時涉及到鼠標的移動&#xff0c;就是鼠標按下右鍵且移動時&#xff0c;則不需要彈出菜單&a…