欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++17中的折疊表達(dá)式實(shí)現(xiàn)

 更新時(shí)間:2020年11月18日 10:25:42   作者:ztenv  
這篇文章主要介紹了C++17中的折疊表達(dá)式實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

前言

C++11 提供了可變模板參數(shù)包, 使函數(shù)可以接受任意數(shù)量的參數(shù). 但在 C++11中展開(kāi)參數(shù)包稍顯麻煩, 而 C++17 的折疊表達(dá)式使得展開(kāi)參數(shù)包變得容易, 其基本語(yǔ)法是使用 (…) 的語(yǔ)法形式進(jìn)行展開(kāi)。

支持的操作符

C++17中,折疊表達(dá)式支持 32 個(gè)操作符:

 +, -, *, /, %, ^, &, |, =, <,
>, <<, >>, +=, -=, *=, /=, %=, ^=, &=, |=, <<=,
>>=,==, !=, <=, >=, &&, ||, ,, .*, ->*.

折疊分類

折疊位置

1.左折疊
2.右折疊

操作數(shù)個(gè)數(shù)
1.一元折疊
2.二元折疊

例 1: 左折疊

template <typename ... Ts>
auto sum(Ts ... ts)
{
  return (... + ts);
}

int res{sum(1, 2, 3, 4, 5)};
std::string a{"Hello "};
std::string b{"World"};
std::string str_res {sum(a, b)};//a+b的結(jié)果

例 2: 右折疊

template <typename ... Ts>
auto sum(Ts ... ts)
{
  return (ts + ...);
}

例 1 中, 參數(shù)包 … 位于操作符的左側(cè),故爾稱為左折疊。 如果 …位于操作符右側(cè),則稱為右折疊,如例 2 所示。就例 1 與例 2 而言,左折疊與右折疊的效果是相同的。

int res {sum(1, 2, 3, 4, 5)};
//左折疊的展開(kāi)方式為

 1 + (2 + (3 + (4 + 5))),
//右折疊的展開(kāi)方式為

(((1 + 2) + 3) + 4) + 5
//在例 1 與 例 2 中,如果參數(shù)包包含的參數(shù)數(shù)量為 0,即為空包,會(huì)產(chǎn)生編譯錯(cuò)誤,如

int the_sum {sum()};
/*大致的錯(cuò)誤輸出如下

In instantiation of 'auto sum(Ts ...) [with Ts = {}]':
error: fold of empty expansion over operator+
   return (... + ts);
*/

若要解決空參數(shù)包的編譯錯(cuò)誤,針對(duì)例 1,可以加上一個(gè)數(shù)值 0,可以解決編譯錯(cuò)誤又可以使得語(yǔ)義不變,這個(gè) 0 相當(dāng)于缺省值。通過(guò)加上一個(gè)數(shù)值,折疊就變成了二元折疊,如例 3 所示。

例 3: 二元折疊

template <typename ... Ts>
auto sum(Ts ... ts)
{
  // 二元右折疊
  return (ts + ... + 0);

  // 二元左折疊
  // return (0 + ... + ts);
}

此時(shí)對(duì)于 int res{sum(1, 2, 3, 4, 5)};折疊的展開(kāi)方式為
1 + (2 + (3 + (4 + (5 + 0))))

空參數(shù)包

空參數(shù)包就是參數(shù)包中不含任何參數(shù)。對(duì)于大多數(shù)操作符,空參數(shù)包將會(huì)引發(fā)編譯錯(cuò)誤。對(duì)于 && 或 ||,空參數(shù)包是合法的,其中 && 的展開(kāi)結(jié)果為 true,||的展開(kāi)結(jié)果為 false。在逗號(hào) , 操作符中,空參數(shù)包也合法,展開(kāi)為 void()。

例 4: 計(jì)算指定區(qū)間內(nèi)包含指定數(shù)值的個(gè)數(shù)

template <typename R, typename ... Ts>
auto count(const R& range, Ts ... ts)
{
  return (std::count(std::begin(range), std::end(range), ts) + ...);
}
...
std::vector<int> v {1, 2, 3, 4, 5};
count(v,     2, 5);     // returns 2
count(v,     100, 200);   // returns 0
count("abcdefg", 'x', 'y', 'z'); // returns 0
count("abcdefg", 'a', 'd', 'f'); // returns 3

例 5: 檢查插入多個(gè)元素是否成功

template <typename T, typename ... Ts>
bool insert_all(T &set, Ts ... ts)
{
  return (set.insert(ts).second && ...);
}
...
std::set<int> my_set {1, 2, 3};
insert_all(my_set, 4, 5, 6); // Returns true, my_set 值為 {1, 2, 3, 4, 5, 6}
insert_all(my_set, 7, 2, 8); // Returns false, my_set 值為 {1, 2, 3, 4, 5, 6, 7}
               // 插入 2 時(shí)出錯(cuò), 8 不會(huì)被插入

最后

1.對(duì)于一元右折疊 (E op …) 具體展開(kāi)為 E1 op (… op (EN-1 op EN))。
2.對(duì)于一元左折疊 (… op E) 具體展開(kāi)為 (( E1 op E2) op …) op En。
3.對(duì)于二元右折疊 (E op … op I) 具體展開(kāi)為 E1 op (… op (EN-1 op (EN op I)))。
4.對(duì)于二元左折疊 (I op … op E) 具體展開(kāi)為 (((I op E1) op E2) op …) op E2。

左折疊與右折疊的語(yǔ)義并非總是相同的。比如對(duì)于加法和乘法,左折疊與右折疊的語(yǔ)義是相同的,但是對(duì)于減法與除法,其語(yǔ)義是不同的。

例 6: 左右折疊不同語(yǔ)義

template<typename... Args>
auto left_sub(Args&&... args) {
  return (... - args);
}

template<typename... Args>
auto right_sub(Args&&... args) {
  return (args - ...);
}
...
auto a = left_sub(2, 3, 4); // ((2 - ) -3 ) - 4) = -5
auto b = right_sub(2, 3, 4); // (2 - (3 - 4)) = 3

到此這篇關(guān)于C++17中的折疊表達(dá)式實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)C++17 折疊表達(dá)式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:

相關(guān)文章

  • C++?AnimeGAN實(shí)現(xiàn)照片一鍵動(dòng)漫化

    C++?AnimeGAN實(shí)現(xiàn)照片一鍵動(dòng)漫化

    AnimeGAN是是由神經(jīng)網(wǎng)絡(luò)風(fēng)格遷移加生成對(duì)抗網(wǎng)絡(luò)(GAN)而成,它是基于CartoonGAN的改進(jìn),并提出了一個(gè)更加輕量級(jí)的生成器架構(gòu)。本文將介紹如何運(yùn)用AnimeGAN實(shí)現(xiàn)照片一鍵動(dòng)漫化,需要的可以參考一下
    2021-11-11
  • C++基于Floyd算法實(shí)現(xiàn)校園導(dǎo)航系統(tǒng)

    C++基于Floyd算法實(shí)現(xiàn)校園導(dǎo)航系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C++基于Floyd算法實(shí)現(xiàn)校園導(dǎo)航系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • 深入理解C++中的文件操作

    深入理解C++中的文件操作

    這篇文章主要給大家深入的介紹了C++中的文件操作,文件的操作對(duì)每個(gè)程序員來(lái)說(shuō)都是很重要的,本文的介紹的很詳細(xì),有需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
    2017-01-01
  • C語(yǔ)言中的初階指針詳解

    C語(yǔ)言中的初階指針詳解

    這篇文章主要介紹了C語(yǔ)言中的初階指針,介紹了其相關(guān)概念,具有一定參考價(jià)值。需要的朋友可以了解下,希望能夠給你帶來(lái)幫助
    2021-10-10
  • Linux下C語(yǔ)言實(shí)現(xiàn)貪吃蛇小游戲

    Linux下C語(yǔ)言實(shí)現(xiàn)貪吃蛇小游戲

    這篇文章主要為大家詳細(xì)介紹了Linux下C語(yǔ)言實(shí)現(xiàn)貪吃蛇小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-03-03
  • C數(shù)據(jù)結(jié)構(gòu)中串簡(jiǎn)單實(shí)例

    C數(shù)據(jù)結(jié)構(gòu)中串簡(jiǎn)單實(shí)例

    這篇文章主要介紹了C數(shù)據(jù)結(jié)構(gòu)中串簡(jiǎn)單實(shí)例的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • C語(yǔ)言自定義類型全解析

    C語(yǔ)言自定義類型全解析

    在C語(yǔ)言中自定義類型主要有結(jié)構(gòu)體類型、位段、枚舉類型、聯(lián)合體類型,自定義類型是面試常會(huì)碰到的內(nèi)容,今天我們來(lái)詳細(xì)了解一下它
    2022-02-02
  • 深入理解goto語(yǔ)句的替代實(shí)現(xiàn)方式分析

    深入理解goto語(yǔ)句的替代實(shí)現(xiàn)方式分析

    本篇文章是對(duì)goto語(yǔ)句的替代實(shí)現(xiàn)方式進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C++實(shí)現(xiàn)softmax函數(shù)的面試經(jīng)驗(yàn)

    C++實(shí)現(xiàn)softmax函數(shù)的面試經(jīng)驗(yàn)

    這篇文章主要為大家介紹了C++實(shí)現(xiàn)softmax函數(shù)的面試經(jīng)驗(yàn),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • 淺談C++/C關(guān)于#define的那些奇奇怪怪的用法

    淺談C++/C關(guān)于#define的那些奇奇怪怪的用法

    本文主要介紹了C++/C關(guān)于#define的那些奇奇怪怪的用法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07

最新評(píng)論