色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
电子发烧友
开通电子发烧友VIP会员 尊享10大特权
海量资料免费下载
精品直播免费看
优质内容免费畅学
课程9折专享价
創作中心

完善資料讓更多小伙伴認識你,還能領取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

    文章

    7623

    瀏覽量

    166215
  • C++語言
    +關注

    關注

    0

    文章

    147

    瀏覽量

    7214
  • 封裝器
    +關注

    關注

    0

    文章

    7

    瀏覽量

    5926

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

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

收藏 0人收藏

    評論

    相關推薦
    熱點推薦

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

    樹莓派和香蕉派到底有什么區別?國產還是英產的區別?就算山寨也有山寨的區別,如果不是山寨那到的區別在哪
    發表于 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 ?1w次閱讀

    C++中struct和class的區別

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

    functioninvoke區別

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

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

    梯形絲桿和滾珠絲桿的區別在哪里?
    的頭像 發表于 03-28 17:48 ?2861次閱讀
    梯形絲桿和滾珠絲桿的<b class='flag-5'>區別在哪</b>里?
    主站蜘蛛池模板: 亚洲精品国产精品精 | 狠狠色噜噜狠狠狠狠米奇777 | 亚洲精品美女久久久久99 | 中文字幕人成人乱码亚洲AV | 中文字幕乱码一区AV久久 | a亚洲在线观看不卡高清 | 国产Av男人的天堂精品良久 | 午夜一级免费视频 | 女生扒开尿口 | 美女尿口羞羞视频 | 交换年轻夫妇HD中文字幕 | 钉钉女老师 | 果冻传媒视频在线播放 | 网红刘婷hd国产高清 | 内射无码AV-区二区在线观看 | 久拍国产在线观看 | 亚洲妈妈精品一区二区三区 | 樱花动漫成人隐藏入口 | 99久久99久久久精品齐齐鬼色 | 一本道无码v亚洲 | 亚洲精品无码不卡在线播放he | 男人插女人动态图 | 快播黄色电影 | 伊人久久综合网站 | 极品少妇小泬50PTHEPON | 男插女高潮一区二区 | 纯肉腐文高H总受男男 | 99re久久这里只有精品 | 最近免费中文字幕MV免费高清 | 国语自产一区第二页 | A级韩国乱理伦片在线观看 a级成人免费毛片完整版 | 德国美女密密麻麻浓毛 | 日本十八禁无遮拦啪啪漫画 | 国产免费播放一区二区三区 | 亚洲国产精品无码中文在线 | 在线 亚洲 日韩 欧洲视频 | 欧美激情久久久久久久大片 | 纯肉高H种马艳遇风流多 | 人妻熟女斩五十路0930 | 古风一女N男到处做高H | 黄色888|

    電子發燒友

    中國電子工程師最喜歡的網站

    • 2931785位工程師會員交流學習
    • 獲取您個性化的科技前沿技術信息
    • 參加活動獲取豐厚的禮品