在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

C++ invoke與function的區別在哪?

程序喵大人 ? 來源:程序喵大人 ? 2023-09-04 09:11 ? 次閱讀

C++ invoke

invoke是C++17標準引入的一個函數模板,用來調用可調用對象(Callable Object,如函數指針、函數對象、成員函數指針等)并返回結果。

invoke提供了統一的調用語法,無論可調用對象的類型是什么,都可以使用同一種方式進行調用。

b22b07da-4aba-11ee-97a6-92fbcf53809c.png

在C++17之前,調用不同類型的可調用對象需要使用不同的語法,比如直接調用函數、使用類對象的運算符重載操作符()來調用函數對象、使用成員函數指針來調用類成員函數等等。這些調用方式雖然能用,但是不夠靈活,而invoke解決了這種不一致的問題。

invoke函數的實現原理是通過使用SFINAE(Substitution Failure Is Not An Error)技術來判斷可調用對象的類型,并根據類型調用對應的調用方式。因此,無論可調用對象的類型是什么,都可以使用invoke函數來調用,而不需要使用不同的語法。

下面是invoke的示例代碼:

#include 
#include 


void foo(int a, int b)
{
    std::cout << "a + b = " << a + b << std::endl;
}


class Bar
{
public:
    void operator()(int a, int b)
{
        std::cout << "a - b = " << a - b << std::endl;
    }
};


int main()
{
    int a = 10, b = 5;
    std::invoke(foo, a, b); // 調用普通函數
    Bar bar;
    std::invoke(bar, a, b); // 調用函數對象
    std::invoke(&Bar::operator(), bar, a, b); // 調用成員函數
    std::function f = foo;
    std::invoke(f, a, b); // 調用std::function對象
    return 0;
}

總結:std::invoke 提供了一種通用的函數調用語法,可以方便地調用各種可調用對象。

function與invoke的區別

std::function和std::invoke是兩個不同的東西,功能也不同。std::function是一個函數對象的封裝器,可以用來封裝任意類型的可調用對象,比如函數指針、lambda表達式等,而 std::invoke 則是一個函數模板,用于在統一的接口下調用可調用對象。

比如,我們可以使用std::function來存儲一個函數指針:

#include 
#include 


void foo(int a, int b)
{
    std::cout << "foo(" << a << ", " << b << ")" << std::endl;
}


int main()
{
    std::function f = foo;
    f(1, 2);
}

上述代碼中,我們將函數指針foo封裝成了一個std::function對象f,然后通過調用f(1, 2)來調用函數foo。

std::invoke的作用是提供一種通用的函數調用語法,可以用統一的方式來調用各種可調用對象,而不必關心它們具體是什么類型。

比如,可以使用std::invoke來調用一個東西,無論這個東西是函數指針、函數對象還是成員函數指針:

#include 
#include 


void foo(int a, int b)
{
    std::cout << "foo(" << a << ", " << b << ")" << std::endl;
}


class Bar {
public:
    void bar(int a, int b) const
{
        std::cout << "Bar::bar(" << a << ", " << b << ")" << std::endl;
    }
};


int main()
{
    std::invoke(foo, 1, 2);


    Bar b;
    std::invoke(&Bar::bar, &b, 1, 2);
}

上面代碼,使用std::invoke分別調用了函數foo和類Bar的成員函數bar,并傳遞了相應的參數

總結,std::function和std::invoke的使用場景是不同的。std::function 適用于需要存儲可調用對象的場景,而std::invoke則適用于統一調用各種不同類型的可調用對象的場景。





審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 存儲器
    +關注

    關注

    38

    文章

    7492

    瀏覽量

    163842
  • C++語言
    +關注

    關注

    0

    文章

    147

    瀏覽量

    6992
  • 封裝器
    +關注

    關注

    0

    文章

    7

    瀏覽量

    5877

原文標題:C++ invoke與function的區別

文章出處:【微信號:程序喵大人,微信公眾號:程序喵大人】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    樹莓派和香蕉派的區別在哪

    樹莓派和香蕉派到底有什么區別?國產還是英產的區別?就算山寨也有山寨的區別,如果不是山寨那到的區別在哪
    發表于 03-12 14:49

    請問REV C和REV B的版本區別在哪里?

    REV C 和REV B的版本區別在哪里?
    發表于 08-22 06:39

    模擬地與信號地的區別在哪里?

    模擬地與信號地的區別在哪里?在復雜混合信號PCB設計中有哪些注意事項?
    發表于 04-23 06:19

    TDD與FDD的區別在哪里?

    TDD與FDD的區別在哪里?TD-SCDMA系統優勢有哪些?
    發表于 05-25 06:03

    string類型數據與《string.h》頭文件的區別在哪里?

    string的含義是什么?string與vector容器的區別在哪c中的字符串是什么?string類型數據與《string.h》頭文件的區別在哪里?
    發表于 07-05 07:18

    數字舵機與模擬舵機的區別在哪

    舵機是什么?數字舵機的工作原理是什么?數字舵機與模擬舵機區別在哪
    發表于 07-13 06:16

    相電流和線電流的區別在哪

    什么是相電流?什么是線電流?相電流和線電流的區別在哪
    發表于 09-29 07:44

    JTAG和SWD的區別在哪

    JTAG和SWD的區別在哪?USART和UART的區別在哪
    發表于 10-08 09:01

    sizeof和strlen函數的區別在哪

    野指針是指指針指向的位置是不可知的,主要成因是什么?sizeof和strlen函數的區別在哪?鏈表和數組的區別在哪
    發表于 12-24 07:19

    SoftMAC和FullMAC的區別在哪

    Wifi設備的協議棧是怎樣的?SoftMAC和FullMAC的區別在哪呢?SoftMAC和FullMAC分別有哪些優勢呢?
    發表于 03-10 08:00

    RTK和GPS定位的區別在哪里?

    RTK和GPS定位的區別在哪里?
    發表于 05-08 10:08 ?76次下載

    串口屏和并口屏的區別在哪

    串口屏還是并口屏好用?區別在哪里?
    的頭像 發表于 01-23 09:53 ?9874次閱讀

    C++中struct和class的區別

    C++中struct和class的區別是什么?C++中struct和class的最大區別在于: ? ? ? ? struct的成員默認是公有的, 而class的成員默認是私有的,
    的頭像 發表于 03-10 17:41 ?766次閱讀

    functioninvoke區別

    std::function和std::invoke是兩個不同的東西,功能也不同。std::function 是一個函數對象的封裝器,可以用來封裝任意類型的可調用對象,比如函數指針、lambda表達式等
    的頭像 發表于 04-27 15:13 ?753次閱讀

    梯形絲桿和滾珠絲桿的區別在哪里?

    梯形絲桿和滾珠絲桿的區別在哪里?
    的頭像 發表于 03-28 17:48 ?2414次閱讀
    梯形絲桿和滾珠絲桿的<b class='flag-5'>區別在哪</b>里?
    主站蜘蛛池模板: 啪啪日韩| 国产精品久久久久久吹潮| 最新合集丨新片速递| 日韩精品你懂的在线播放| 国产精品视频你懂的| 久操视频免费| 中文字幕日本一区波多野不卡| 免费黄色国产视频| 天天艹天天操| 久久99热久久精品99| 免费国产成高清人在线视频| 天天爱天天做色综合| 日本在线不卡免费| 噜噜色综合| 国内自拍2021| 午夜精品网| 99热这里只有精品一区二区三区| 性欧美精品xxxx| 手机在线色| 天天爽夜夜爽视频| 久久精品国产99久久72| 精品香港经典三级在线看| 国产精品理论片在线观看| 婷婷五月花| 午夜日批| 69re在线观看| 成熟妇女毛耸耸性视频| 欧美极品在线| 日本a级在线| 久久久久久夜精品精品免费| 一级欧美在线的视频| www在线视频在线播放| 1314酒色网| 久久精品免费观看视频| 3344免费播放观看视频| 日韩有色| 九九精品影院| 日韩一区二区三区在线| 欧美成人在线影院| 婷婷六月天在线| 天天插天天干天天操|