0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

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

3天內(nèi)不再提示

C++ invoke與function的區(qū)別在哪?

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

C++ invoke

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

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

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

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

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

下面是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); // 調(diào)用普通函數(shù)
    Bar bar;
    std::invoke(bar, a, b); // 調(diào)用函數(shù)對象
    std::invoke(&Bar::operator(), bar, a, b); // 調(diào)用成員函數(shù)
    std::function f = foo;
    std::invoke(f, a, b); // 調(diào)用std::function對象
    return 0;
}

總結(jié):std::invoke 提供了一種通用的函數(shù)調(diào)用語法,可以方便地調(diào)用各種可調(diào)用對象。

function與invoke的區(qū)別

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

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

#include 
#include 


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


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

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

std::invoke的作用是提供一種通用的函數(shù)調(diào)用語法,可以用統(tǒng)一的方式來調(diào)用各種可調(diào)用對象,而不必關(guān)心它們具體是什么類型。

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

#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分別調(diào)用了函數(shù)foo和類Bar的成員函數(shù)bar,并傳遞了相應(yīng)的參數(shù)。

總結(jié),std::function和std::invoke的使用場景是不同的。std::function 適用于需要存儲可調(diào)用對象的場景,而std::invoke則適用于統(tǒng)一調(diào)用各種不同類型的可調(diào)用對象的場景。





審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 存儲器
    +關(guān)注

    關(guān)注

    38

    文章

    7492

    瀏覽量

    163842
  • C++語言
    +關(guān)注

    關(guān)注

    0

    文章

    147

    瀏覽量

    6992
  • 封裝器
    +關(guān)注

    關(guān)注

    0

    文章

    7

    瀏覽量

    5877

原文標題:C++ invoke與function的區(qū)別

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

收藏 人收藏

    評論

    相關(guān)推薦

    樹莓派和香蕉派的區(qū)別在哪

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

    請問REV C和REV B的版本區(qū)別在哪里?

    REV C 和REV B的版本區(qū)別在哪里?
    發(fā)表于 08-22 06:39

    模擬地與信號地的區(qū)別在哪里?

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

    TDD與FDD的區(qū)別在哪里?

    TDD與FDD的區(qū)別在哪里?TD-SCDMA系統(tǒng)優(yōu)勢有哪些?
    發(fā)表于 05-25 06:03

    string類型數(shù)據(jù)與《string.h》頭文件的區(qū)別在哪里?

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

    數(shù)字舵機與模擬舵機的區(qū)別在哪?

    舵機是什么?數(shù)字舵機的工作原理是什么?數(shù)字舵機與模擬舵機區(qū)別在哪?
    發(fā)表于 07-13 06:16

    相電流和線電流的區(qū)別在哪

    什么是相電流?什么是線電流?相電流和線電流的區(qū)別在哪
    發(fā)表于 09-29 07:44

    JTAG和SWD的區(qū)別在哪

    JTAG和SWD的區(qū)別在哪?USART和UART的區(qū)別在哪?
    發(fā)表于 10-08 09:01

    sizeof和strlen函數(shù)的區(qū)別在哪

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

    SoftMAC和FullMAC的區(qū)別在哪

    Wifi設(shè)備的協(xié)議棧是怎樣的?SoftMAC和FullMAC的區(qū)別在哪呢?SoftMAC和FullMAC分別有哪些優(yōu)勢呢?
    發(fā)表于 03-10 08:00

    RTK和GPS定位的區(qū)別在哪里?

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

    串口屏和并口屏的區(qū)別在哪

    串口屏還是并口屏好用?區(qū)別在哪里?
    的頭像 發(fā)表于 01-23 09:53 ?9872次閱讀

    C++中struct和class的區(qū)別?

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

    functioninvoke區(qū)別

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

    梯形絲桿和滾珠絲桿的區(qū)別在哪里?

    梯形絲桿和滾珠絲桿的區(qū)別在哪里?
    的頭像 發(fā)表于 03-28 17:48 ?2414次閱讀
    梯形絲桿和滾珠絲桿的<b class='flag-5'>區(qū)別在哪</b>里?