日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > c/c++ >内容正文

c/c++

C++变参模板类

發(fā)布時(shí)間:2024/3/13 c/c++ 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++变参模板类 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

C++可變參數(shù)模板

之前學(xué)習(xí)模板,都是固定參數(shù)的模板,前段時(shí)間看源碼時(shí),注意到了變參模板類(lèi),覺(jué)得很有意思。

什么是可變參模板

template<typename... Args> class MoreApply;

如上,就是一個(gè)可變參模板類(lèi)的申明。至于Args…中傳進(jìn)來(lái)多少參數(shù),由使用者決定。了解變參模板函數(shù)的程序員都知道,變參模板作難的是參數(shù)展開(kāi),變參模板類(lèi)也不例外,接下來(lái),介紹兩種常見(jiàn)的變參模板類(lèi)參數(shù)展開(kāi)方法:

1.包含展開(kāi)

下面代碼展示了一個(gè)變參模板類(lèi),遍歷所有模板參數(shù),判斷一個(gè)值。

#include<iostream> using namespace std;//純虛函數(shù) struct AbstractBase {virtual bool hander(const int& n) = 0; };//變參模板類(lèi)的申明 template <typename... Args> struct VarParaClass;//變參模板類(lèi)的展開(kāi),這里我們把參數(shù)分成兩塊,第一塊參數(shù)T,和第二塊參數(shù)Args...; //T和VarParaClass<Args...>分別作為VarParaClass<T, Args... >類(lèi)的成員變量 //VarParaClass<T, Args... >中的hander函數(shù)首先調(diào)用T中的hander函數(shù),然后得到一個(gè)狀態(tài)status,根據(jù)這個(gè)狀態(tài)判斷是否要調(diào)用下一個(gè)參數(shù)包 template<typename T, typename ... Args> struct VarParaClass<T, Args... > : AbstractBase {virtual bool hander(const int& n){auto& first = static_cast<AbstractBase&>(t);bool status = first.hander(n);if(status)return status;auto& next = static_cast<AbstractBase&>(args);return next.hander(n);} private:T t;VarParaClass<Args...> args; };// 模板特化,終止展開(kāi)參數(shù)包的條件 template<> struct VarParaClass<>:AbstractBase {virtual bool hander(const int& n){std::cout << "nothing" << std::endl;return false;} };// 參數(shù)包,每個(gè)參數(shù)包都繼承了AbstractBase,并且復(fù)寫(xiě)了hander方法 struct ParaClass1 : AbstractBase {bool hander(const int& n){if( n == 1){std::cout << "ParaClass1" << std::endl;return true;}else{std::cout << "next hander2" << std::endl;return false;}} };struct ParaClass2 : AbstractBase {bool hander(const int& n){if( n == 2){std::cout << "ParaClass2" << std::endl;return true;}else{std::cout << "next hander3" << std::endl;return false;}} };struct ParaClass3 : AbstractBase {bool hander(const int& n){if( n == 3){std::cout << "ParaClass3" << std::endl;return true;}else{std::cout << "last hander" << std::endl;return false;}} };int main() {VarParaClass<ParaClass1,ParaClass2,ParaClass3> A;AbstractBase* p = &A;p->hander(2);return 0; }

**注意:**充分利用多態(tài),因?yàn)樗械念?lèi)都繼承了抽象類(lèi)AbstractBase;
變參模板類(lèi)的申明和終止模板必須有。

下面展示一些 輸出。

// An highlighted block next hander2 ParaClass2

2.繼承展開(kāi)

//純虛函數(shù) struct AbstractBase {virtual bool hander(const int& n) = 0; };//變參模板類(lèi)的申明 template <typename... Args> struct VarParaClass;//變參模板類(lèi)的展開(kāi),這里我們把參數(shù)分成兩塊,第一塊參數(shù)T,和第二塊參數(shù)Args...; //T和VarParaClass<Args...>分別繼承到VarParaClass<T, Args... >類(lèi)下 //VarParaClass<T, Args... >中的hander函數(shù)首先調(diào)用T中的hander函數(shù),然后得到一個(gè)狀態(tài)status,根據(jù)這個(gè)狀態(tài)判斷是否要調(diào)用下一個(gè)參數(shù)包 template<typename T, typename ... Args> struct VarParaClass<T, Args... > : T, VarParaClass<Args...> {bool hander(const int& n){bool status = T::hander(n);if(status == false)return VarParaClass<Args...>::hander(n);return status;} };// 模板特化,終止展開(kāi)參數(shù)包的條件 template<> struct VarParaClass<>: AbstractBase {bool hander(const int& n){std::cout << "nothing" << std::endl;return false;} };struct ParaClass1 : AbstractBase {bool hander(const int& n){if( n == 1){std::cout << "ParaClass1" << std::endl;return true;}else{std::cout << "next hander2" << std::endl;return false;}} };struct ParaClass2 : AbstractBase {bool hander(const int& n){if( n == 2){std::cout << "ParaClass2" << std::endl;return true;}else{std::cout << "next hander3" << std::endl;return false;}} };struct ParaClass3 : AbstractBase {bool hander(const int& n){if( n == 3){std::cout << "ParaClass3" << std::endl;return true;}else{std::cout << "last hander" << std::endl;return false;}} };int main() {VarParaClass<ParaClass1,ParaClass2,ParaClass3> A;A.hander(4);return 0; } \\輸出 next hander2 next hander3 last hander nothing

總結(jié)

可以看出,變參模板類(lèi)的使用給變成帶來(lái)了很多便利,但是使用起來(lái)并沒(méi)有那么簡(jiǎn)單,變參模板類(lèi)的使用需要設(shè)計(jì),不管是使用包含展開(kāi)還是繼承展開(kāi),都需要程序員自己去設(shè)計(jì),并沒(méi)有一個(gè)簡(jiǎn)單的模板套用。

變參函數(shù)學(xué)習(xí),可以參考如下鏈接

鏈接: link

總結(jié)

以上是生活随笔為你收集整理的C++变参模板类的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。