std::function
和std::invoke
是兩個(gè)不同的東西,功能也不同。std::function
是一個(gè)函數(shù)對(duì)象的封裝器,可以用來封裝任意類型的可調(diào)用對(duì)象,比如函數(shù)指針、lambda表達(dá)式等,而 std::invoke
則是一個(gè)函數(shù)模板,用于在統(tǒng)一的接口下調(diào)用可調(diào)用對(duì)象。
比如,我們可以使用 std::function
來存儲(chǔ)一個(gè)函數(shù)指針:
void foo(int a, int b)
{
std::cout << "foo(" << a << ", " << b << ")" << std::endl;
}
int main()
{
std::function<void(int, int)> f = foo;
f(1, 2);
}
上述代碼中,我們將函數(shù)指針 foo
封裝成了一個(gè) std::function
對(duì)象 f
,然后通過調(diào)用 f(1, 2)
來調(diào)用函數(shù) foo
。
std::invoke
的作用是提供一種通用的函數(shù)調(diào)用語法,可以用統(tǒng)一的方式來調(diào)用各種可調(diào)用對(duì)象,而不必關(guān)心它們具體是什么類型。
比如,可以使用 std::invoke
來調(diào)用一個(gè)東西,無論這個(gè)東西是函數(shù)指針、函數(shù)對(duì)象還是成員函數(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
的使用場(chǎng)景是不同的。std::function
適用于需要存儲(chǔ)可調(diào)用對(duì)象的場(chǎng)景,而 std::invoke
則適用于統(tǒng)一調(diào)用各種不同類型的可調(diào)用對(duì)象的場(chǎng)景。
審核編輯 :李倩
-
Function
+關(guān)注
關(guān)注
0文章
14瀏覽量
10117 -
封裝器
+關(guān)注
關(guān)注
0文章
7瀏覽量
5949 -
invoke
+關(guān)注
關(guān)注
0文章
4瀏覽量
2048
原文標(biāo)題:function與invoke的區(qū)別
文章出處:【微信號(hào):程序喵大人,微信公眾號(hào):程序喵大人】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
轉(zhuǎn)載---verilog中task和function的區(qū)別
LabVIEW Property Node 及 Invoke Node 教學(xué)
MegaCore Function User Guide
MATLAB的S-Function編寫指導(dǎo)
換向機(jī)能 Reversal Function

什么是Function Keys
形似亞馬遜Echo:哈曼卡頓Cortana智能音箱Invoke預(yù)計(jì)8月份上市
C++ function技術(shù)的實(shí)現(xiàn)與具體運(yùn)用
std::function簡(jiǎn)介及模板類聲明
在Java方法中調(diào)用Lua function
Simulink Function模塊竟然可以這樣測(cè)

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

評(píng)論