国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

C++遍歷std::tuple(C++14 ~ C++20)

這篇具有很好參考價(jià)值的文章主要介紹了C++遍歷std::tuple(C++14 ~ C++20)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

本文展示了遍歷std::tuple的方式:

首先比較容易想到的是利用C++14的std::make_index_sequencestd::get結(jié)合取值,然后配合std::initializer_list進(jìn)行包展開:

// since C++14
class Func0 {
    template<typename T, typename F, size_t... I>
    void init(T&& t, F&& f, std::index_sequence<I...>) {
        std::initializer_list<int>{ (f(std::get<I>(t)), 0)... };
    }
public:
    template<typename T, typename F>
    auto operator()(T&& t, F&& f) {
        init(t, f, std::make_index_sequence<std::tuple_size_v<std::remove_reference_t<T>>>{});
    }
};

到了C++17,我們有了折疊表達(dá)式(Fold expressions),就可以直白一點(diǎn)了:

// since C++17
class Func1 {
    template<typename T, typename F, size_t... I>
    void init(T&& t, F&& f, std::index_sequence<I...>) {
        ((f(std::get<I>(t))), ...);
    }
public:
    template<typename T, typename F>
    auto operator()(T&& t, F&& f) {
        init(t, f, std::make_index_sequence<std::tuple_size_v<std::remove_reference_t<T>>>{});
    }
};

C++20允許lambda添加模板參數(shù),因此我們可以進(jìn)一步限制這個(gè)遍歷器的作用域:

    // since C++20
    auto Func2 = []<typename T, typename F>(T && t, F && f) {
        [&] <size_t ...I>(std::index_sequence<I...>) {
            ((f(std::get<I>(t))), ...);
        }(std::make_index_sequence<std::tuple_size_v<std::remove_reference_t<T>>>{});
    };

然后我們還可以利用C++17提供給我們的std::apply取值:

// since C++17
class Func3 {
public:
    template<typename T, typename F>
    auto operator()(T&& t, F&& f) {
        std::apply(
            [&f](auto&&... args) {
                ((f(args)), ...);
            }, t
        );
    }
};

或者干脆把這個(gè)std::apply給拿出來(lái),這種應(yīng)該算是最簡(jiǎn)單的:

// since C++17
std::apply(
    [&PrintV](auto&&... args) {
        ((PrintV(args)), ...);
    }, t
);

完整測(cè)試程序:

#include <iostream>
#include <tuple>
#include <type_traits>
#include <initializer_list>


// since C++14
class Func0 {
    template<typename T, typename F, size_t... I>
    void init(T&& t, F&& f, std::index_sequence<I...>) {
        std::initializer_list<int>{ (f(std::get<I>(t)), 0)... };
    }
public:
    template<typename T, typename F>
    auto operator()(T&& t, F&& f) {
        init(t, f, std::make_index_sequence<std::tuple_size_v<std::remove_reference_t<T>>>{});
    }
};

// since C++17
class Func1 {
    template<typename T, typename F, size_t... I>
    void init(T&& t, F&& f, std::index_sequence<I...>) {
        ((f(std::get<I>(t))), ...);
    }
public:
    template<typename T, typename F>
    auto operator()(T&& t, F&& f) {
        init(t, f, std::make_index_sequence<std::tuple_size_v<std::remove_reference_t<T>>>{});
    }
};

// since C++17
class Func3 {
public:
    template<typename T, typename F>
    auto operator()(T&& t, F&& f) {
        std::apply(
            [&f](auto&&... args) {
                ((f(args)), ...);
            }, t
        );
    }
};


int main(int argc, char* argv[])
{
    // 測(cè)試一下
    // auto t = std::make_tuple(1, 2.f, 3., '4', "5");  // for C++14
    std::tuple t(1, 2.f, 3., '4', "5"); 
    auto PrintV = [](auto&& v) { std::cout << v << ' '; };

    Func0()(t, PrintV);
    std::cout << "\n\n";
    
    Func1()(t, PrintV);
    std::cout << "\n\n";
    
    // since C++20
    auto Func2 = []<typename T, typename F>(T && t, F && f) {
        [&] <size_t ...I>(std::index_sequence<I...>) {
            ((f(std::get<I>(t))), ...);
        }(std::make_index_sequence<std::tuple_size_v<std::remove_reference_t<T>>>{});
    };
    Func2(t, PrintV);
    std::cout << "\n\n";
    
    Func3()(t, PrintV);
    std::cout << "\n\n";

    // since C++17
    std::apply(
        [&PrintV](auto&&... args) {
            ((PrintV(args)), ...);
        }, t
    );
    std::cout << "\n\n";
    return 0;
}

輸出結(jié)果:
C++遍歷std::tuple(C++14 ~ C++20),c++,開發(fā)語(yǔ)言文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-654615.html

到了這里,關(guān)于C++遍歷std::tuple(C++14 ~ C++20)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • C++標(biāo)準(zhǔn)學(xué)習(xí)--tuple

    C++標(biāo)準(zhǔn)學(xué)習(xí)--tuple

    以下帖子介紹的比較詳細(xì): C++的 tuple_c++ tuple-CSDN博客 tuple 是 C++11 新標(biāo)準(zhǔn)里的類型,它是一個(gè)類似 pair 類型的模板。tuple 是一個(gè)固定大小的不同類型值的集合,是泛化的 std::pair。我們也可以把它當(dāng)做一個(gè)通用的結(jié)構(gòu)體來(lái)用,不需要?jiǎng)?chuàng)建結(jié)構(gòu)體又獲取結(jié)構(gòu)體的特征,在某些情況

    2024年02月02日
    瀏覽(13)
  • C++(11):判斷tuple是否含有某個(gè)類型

    有的時(shí)候需要判斷tuple中是否有個(gè)某個(gè)類型,可以借助變長(zhǎng)模板的遞歸調(diào)用方式進(jìn)行檢查: C++(11):變長(zhǎng)模板_變長(zhǎng)模板參數(shù) c++11-CSDN博客 另外還使用了true_type和false_type:

    2024年02月04日
    瀏覽(23)
  • 【C++ STL之string,tuple,array詳解】

    在C++的STL(Standard Template Library)中,std::string是一個(gè)非常有用的字符串類。它提供了一系列操作字符串的功能,包括字符串的創(chuàng)建、修改、查找、拼接等。本文將詳細(xì)介紹C++ STL中std::string的使用方法和一些常見操作。 (1) 支持比較運(yùn)算符 string字符串支持常見的比較操作符(

    2024年02月12日
    瀏覽(47)
  • C++中神奇的tuple:詳解使用技巧和實(shí)例解析

    C++中神奇的tuple:詳解使用技巧和實(shí)例解析

    在C++中,tuple是一種數(shù)據(jù)結(jié)構(gòu),用于將多個(gè)值組合在一起,形成一個(gè)有序的元組。每個(gè)值在tuple中都有一個(gè)對(duì)應(yīng)的索引,可以通過(guò)索引來(lái)訪問(wèn)和操作其中的值。 作用: tuple將多個(gè)值組合在一起,形成一個(gè)整體。這些值可以是不同的數(shù)據(jù)類型,例如整數(shù)、浮點(diǎn)數(shù)、字符串等。

    2024年02月02日
    瀏覽(20)
  • linux如何查看編譯器支持的C++版本(支持C++11、支持C++14、支持C++17、支持C++20)(編譯時(shí)不指定g++版本,默認(rèn)使用老版本編譯)

    linux如何查看編譯器支持的C++版本(支持C++11、支持C++14、支持C++17、支持C++20)(編譯時(shí)不指定g++版本,默認(rèn)使用老版本編譯)

    C++11 C++11是一個(gè)重要的C++標(biāo)準(zhǔn)版本,于2011年發(fā)布。C++11帶來(lái)了許多重要的改進(jìn),包括: 智能指針:引入了shared_ptr和unique_ptr等智能指針,用于更好地管理動(dòng)態(tài)內(nèi)存分配。 新的循環(huán)語(yǔ)句:引入了for循環(huán)中的范圍語(yǔ)法,以更簡(jiǎn)潔的方式遍歷容器。 初始化列表:允許使用初始化列表

    2024年02月02日
    瀏覽(51)
  • UG NX二次開發(fā)(C++)-用UF_OBJ_cycle_objs_in_part遍歷對(duì)象

    UG NX二次開發(fā)(C++)-用UF_OBJ_cycle_objs_in_part遍歷對(duì)象

    UG NX二次開發(fā)中,比如體、面、邊等,在NXOpen中可以通過(guò)Collection來(lái)實(shí)現(xiàn),但是采用遍歷對(duì)象的方式也能實(shí)現(xiàn),這就要需要UF_OBJ_cycle_objs_in_part的函數(shù)。本文就介紹一下這個(gè)方法的使用。 打開UG NX軟件,在UG NX視圖區(qū)創(chuàng)建多個(gè)特征,如下圖所示: 這個(gè)三維模型中,包含了三個(gè)長(zhǎng)方

    2024年02月02日
    瀏覽(104)
  • ?第20課 在Android Native開發(fā)中加入新的C++類

    ?第20課 在Android Native開發(fā)中加入新的C++類

    ?這節(jié)課我們開始利用ffmpeg和opencv在Android環(huán)境下來(lái)實(shí)現(xiàn)一個(gè)rtmp播放器,與第2課在PC端實(shí)現(xiàn)播放器的思路類似,只不過(guò)在處理音視頻顯示和播放的細(xì)節(jié)略有不同。 1.壓縮備份上節(jié)課工程文件夾并修改工程文件夾為demo20,將demo20導(dǎo)入到Eclipse或者在原工程上繼續(xù)下列的開發(fā)步驟。

    2024年01月25日
    瀏覽(22)
  • 14-5_Qt 5.9 C++開發(fā)指南_基于HTTP 協(xié)議的網(wǎng)絡(luò)應(yīng)用程序

    14-5_Qt 5.9 C++開發(fā)指南_基于HTTP 協(xié)議的網(wǎng)絡(luò)應(yīng)用程序

    Qt 網(wǎng)絡(luò)模塊提供一些類實(shí)現(xiàn) OSI 7 層網(wǎng)絡(luò)模型中高層的網(wǎng)絡(luò)協(xié)議,如 HTTP、FTP、SNMP等,這些類主要是 QNetworkRequest、QNetworkReply和QNetworkAccessManager。 QNetworkRequest 類通過(guò)一個(gè)URL 地址發(fā)起網(wǎng)絡(luò)協(xié)議請(qǐng)求,也保存網(wǎng)絡(luò)請(qǐng)求的信息,目前支持 HTTP、FTP 和局部文件 URLs的下載或上傳。 QNe

    2024年02月13日
    瀏覽(28)
  • C++面試八股文:用過(guò)std::set/std::map嗎?

    某日二師兄參加XXX科技公司的C++工程師開發(fā)崗位第27面: 面試官:用過(guò) std::set/std::map 嗎? 二師兄:用過(guò)。 面試官:能介紹一下二者嗎? 二師兄: std::set 是一個(gè)有序的集合,其中的元素是唯一的,即每個(gè)元素只能出現(xiàn)一次。一般用于去重和自動(dòng)排序。 二師兄: std::map 同樣是

    2024年02月11日
    瀏覽(24)
  • C++并發(fā)編程:std::future、std::async、std::packaged_task與std::promise的深度探索

    C++并發(fā)編程:std::future、std::async、std::packaged_task與std::promise的深度探索

    1.1 并發(fā)編程的概念 (Concept of Concurrent Programming) 并發(fā)編程是一種計(jì)算機(jī)編程技術(shù),其核心在于使程序能夠處理多個(gè)任務(wù)同時(shí)進(jìn)行。在單核處理器上,雖然任何給定的時(shí)間只能運(yùn)行一個(gè)任務(wù),但通過(guò)任務(wù)切換,可以創(chuàng)建出并發(fā)執(zhí)行的效果。而在多核處理器上,可以真正同時(shí)處理

    2024年02月05日
    瀏覽(27)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包