最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++?折疊參數(shù)包詳解(悄然增強(qiáng)編程效率)

 更新時(shí)間:2023年05月22日 15:33:53   作者:熱愛編程的小K  
折疊參數(shù)就是一個(gè)參數(shù)包, 代表是多個(gè)未知,tuple元組就是一個(gè)折疊參數(shù)的使用,這篇文章主要介紹了C++?折疊參數(shù)包悄然增強(qiáng)編程效率,需要的朋友可以參考下

前言

本節(jié)將為大家?guī)碚郫B參數(shù)包的詳細(xì)講解,折疊參數(shù)包為C++模板編程提供了更加靈活和強(qiáng)大的工具,可以提高代碼的簡潔性和可讀性,看完后希望對你有收獲

一、介紹

折疊參數(shù)就是一個(gè)參數(shù)包, 代表是多個(gè)未知,tuple元組就是一個(gè)折疊參數(shù)的使用

折疊參數(shù)類型:

  • typename ...Args: Args參數(shù)包的包名 ,本質(zhì)是聲明一個(gè)Args折疊參數(shù)類型
  • Args ...arg: 折疊參數(shù)包類型的變量
  • ...:理解為多個(gè)意思

二、函數(shù)模板中使用折疊參數(shù)

1、遞歸方式展開

遞歸方式的展開是比較好理解的,每一次調(diào)用第二個(gè)print函數(shù)就打印一次data,然后又調(diào)用自己,這時(shí)候參數(shù)包也剝離了一個(gè)參數(shù),也就是調(diào)用自己會打印下一個(gè)data

有的同學(xué)看了下面的代碼可能會疑惑,為什么會有兩個(gè)函數(shù),這是因?yàn)樯厦娴暮瘮?shù)為終止函數(shù),也就是當(dāng)?shù)诙€(gè)函數(shù)參數(shù)包中只有一個(gè)參數(shù)時(shí)調(diào)用第一個(gè)函數(shù)

template <typename _Ty>
void print(_Ty data) 
{
	cout << data << endl;
}
template <typename _Ty,typename ...Args>
void print(_Ty data, Args ...args) 
{
	cout << data << "\t";
	print(args...);
}

2、列表數(shù)據(jù)展開

這個(gè)的難點(diǎn)和重點(diǎn)在于initializer_list<int>{(printData(args), 0)...};,這一行代碼用到了列表和逗號表達(dá)式的特性,不用說列表的每個(gè)值最后都被初始化為0,但是列表的每個(gè)值被初始化為0的時(shí)候,他們會先執(zhí)行printData(args(n)),也就是會不斷打印,參數(shù)包不斷展開

template <typename _Ty>
void printData(_Ty data) {
	cout << data << "\t";
}
template <typename ...Args>
void printArgs(Args ...args)
{
	initializer_list<int>{(printData(args), 0)...};
	cout << endl;
}

3、完美轉(zhuǎn)發(fā)的方式展開

完美轉(zhuǎn)發(fā)一般是用來統(tǒng)一接口,也就是有許多函數(shù),他們的參數(shù)數(shù)量、類型不同,我們把他們統(tǒng)一為只用函數(shù)名就可以調(diào)用該函數(shù),且不減少其原功能

這里我們用仿函數(shù)接收一下用bind綁定的函數(shù)以及參數(shù)包,注意這里函數(shù)和參數(shù)包綁定的時(shí)候都用了完美轉(zhuǎn)發(fā)

什么是完美轉(zhuǎn)發(fā)吶?forword是為了解決在函數(shù)模板中,使用右值引用參數(shù)(T&&),傳遞右值進(jìn)去以后,類型會變?yōu)樽笾档膯栴}。當(dāng)傳入的參數(shù)是一個(gè)對象時(shí),右值變左值就會出問題,因?yàn)樽笾嫡{(diào)用拷貝構(gòu)造,右值調(diào)用移動構(gòu)造。本來可以用移動構(gòu)造提高效率,卻因?yàn)橛抑底兂勺笾?,調(diào)用了拷貝構(gòu)造。所以我們要把它變回去!實(shí)參傳的是右值,進(jìn)入函數(shù)體還是右值,這就是完美轉(zhuǎn)發(fā)

class Test 
{
public:
	void printk() 
	{
		if (func) func();
	}
	template <typename Func,typename ...Args>
	void connect(Func&& f, Args&& ...args)    //右值引用
	{
		func = bind(forward<Func>(f), forward<Args>(args)...);
	}
protected:
	function<void()> func;
};
void sum(int a, int b) 
{
	cout<< a + b;
}
int main() 
{
	Test test;
	test.connect(sum, 1, 2);
	test.printk();
	test.connect([](int a, int b) {cout << endl << a + b; }, 3, 8);
	test.printk();
	return 0;
}

上面的例子中通過connect綁定函數(shù)和參數(shù)包,實(shí)現(xiàn)統(tǒng)一接口的功能,通過printK函數(shù)調(diào)用

三、類模板中使用折疊參數(shù)

1、繼承+模板特化的方式展開

類中實(shí)現(xiàn)折疊參數(shù),前兩個(gè)類是必須,對應(yīng)上面的終止函數(shù),繼承的時(shí)候要寫清楚public Test<Args...>,還有就是第三個(gè)類必須要一個(gè)無參構(gòu)造函數(shù),且?guī)?shù)包的的構(gòu)造函數(shù)初始化時(shí)要調(diào)用子類的構(gòu)造函數(shù),還有就是打印的時(shí)候要一層一層的,采用繼承+模板特化就是一代一代的

template <typename ...Args>
class Test;
template<>
class Test<> {};
template <typename _Ty, typename ...Args>
class Test<_Ty, Args...> :public Test<Args...>
{
public:
	Test() {}
	Test(_Ty data, Args ...args) :data(data), Test<Args...>(args...) {}
	Test<Args...>& getObject() { return *this; }
	_Ty& getData() { return data; }
protected:
	_Ty data;
};
void testOne() 
{
	Test<string, int, double> test("fsdjf", 32, 3.23);
	cout << test.getData() << "\t" << test.getObject().getData() << "\t" << test.getObject().getObject().getData() << endl;
}

2、遞歸的方式展開

遞歸這一種就是把自己當(dāng)對象調(diào)用,其它的和上面相同

template <typename ...Args>
class my_tuple;
template<>
class my_tuple<> {};
template <typename _Ty, typename ...Args>
class my_tuple<_Ty, Args...>
{
public:
	my_tuple() {}
	my_tuple(_Ty data, Args ...args) :data(data),args(args...) {}
	_Ty& getData() { return data; }
	my_tuple<Args...>& getObject() { return *this; }
protected:
	_Ty data;
	my_tuple<Args...> args;
};
void testTwo() 
{
	Test<string, int, double> test("fsdjf", 32, 3.23);
	cout << test.getData() << "\t" << test.getObject().getData() << "\t" << test.getObject().getObject().getData() << endl;
}

到此這篇關(guān)于C++ 折疊參數(shù)包悄然增強(qiáng)編程效率的文章就介紹到這了,更多相關(guān)C++ 折疊參數(shù)包內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • opencv3/C++ FLANN特征匹配方式

    opencv3/C++ FLANN特征匹配方式

    今天小編就為大家分享一篇opencv3/C++ FLANN特征匹配方式,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • C++ 構(gòu)造函數(shù)和析構(gòu)函數(shù)示例詳解

    C++ 構(gòu)造函數(shù)和析構(gòu)函數(shù)示例詳解

    本文詳細(xì)介紹了C++中的構(gòu)造函數(shù)和析構(gòu)函數(shù),包括它們的特點(diǎn)、調(diào)用時(shí)機(jī)以及在資源管理中的重要性,同時(shí),通過與Python的對比,展示了如何在Python中模擬C++的構(gòu)造函數(shù)特性,并強(qiáng)調(diào)了兩種語言在內(nèi)存管理和資源管理機(jī)制上的差異,感興趣的朋友跟隨小編一起看看吧
    2025-11-11
  • C語言實(shí)現(xiàn)C++繼承和多態(tài)的代碼分享

    C語言實(shí)現(xiàn)C++繼承和多態(tài)的代碼分享

    本文主要給大家簡單講訴了C和C++的區(qū)別以及如何使用C語言模擬實(shí)現(xiàn)C++繼承和多態(tài),并附上示例代碼,是篇相當(dāng)不錯(cuò)的文章,推薦給喜歡C語言的小伙伴們
    2017-07-07
  • 一盤王者的時(shí)間用C語言實(shí)現(xiàn)三子棋

    一盤王者的時(shí)間用C語言實(shí)現(xiàn)三子棋

    相信我們都玩過三子棋,規(guī)則很簡單,但想用c語言做出這個(gè)游戲,事實(shí)上也是比較簡單的,下面通過c語言進(jìn)行對五子棋的分析
    2022-02-02
  • 全局變量與局部變量在內(nèi)存中的區(qū)別詳細(xì)解析

    全局變量與局部變量在內(nèi)存中的區(qū)別詳細(xì)解析

    以下是對全局變量與局部變量在內(nèi)存中的區(qū)別進(jìn)行了詳細(xì)的總結(jié)介紹,需要的朋友可以過來參考下,希望對大家有所幫助
    2013-10-10
  • C和C++中的基本數(shù)據(jù)類型的大小及表示范圍詳解

    C和C++中的基本數(shù)據(jù)類型的大小及表示范圍詳解

    這篇文章主要介紹了C和C++中的基本數(shù)據(jù)類型的大小及表示范圍詳解,基本數(shù)據(jù)類型有int、long、long long、float、double、char、string,正文有詳細(xì)介紹,歡迎參考
    2018-01-01
  • 常用的C語言排序算法(兩種)

    常用的C語言排序算法(兩種)

    本文給大家分享兩種常用的C語言排序算法,代碼非常簡單,感興趣的朋友可以參考下
    2016-09-09
  • C++實(shí)現(xiàn)簡單計(jì)算器

    C++實(shí)現(xiàn)簡單計(jì)算器

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)簡單計(jì)算器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • 詳解C語言之單鏈表

    詳解C語言之單鏈表

    這篇文章主要為大家介紹了C語言的單鏈表,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-11-11
  • Visual Studio 2022最新版安裝教程(圖文詳解)

    Visual Studio 2022最新版安裝教程(圖文詳解)

    本文主要介紹了Visual Studio 2022最新版安裝教程,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01

最新評論

延川县| 石家庄市| 阿巴嘎旗| 崇文区| 内江市| 潮安县| 嵩明县| 米脂县| 阿克苏市| 安塞县| 辉南县| 伽师县| 浦北县| 蕲春县| 米泉市| 偏关县| 孝昌县| 聂拉木县| 平邑县| 波密县| 石景山区| 新野县| 寻甸| 离岛区| 霍邱县| 隆子县| 临汾市| 和硕县| 乐东| 胶南市| 峨眉山市| 东至县| 财经| 景德镇市| 万年县| 休宁县| 丽水市| 淄博市| 锦州市| 盐亭县| 惠安县|