std::function
和std::invoke
是兩個不同的東西,功能也不同。std::function
是一個函數對象的封裝器,可以用來封裝任意類型的可調用對象,比如函數指針、lambda表達式等,而 std::invoke
則是一個函數模板,用于在統一的接口下調用可調用對象。
比如,我們可以使用 std::function
來存儲一個函數指針:
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);
}
上述代碼中,我們將函數指針 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
則適用于統一調用各種不同類型的可調用對象的場景。
審核編輯 :李倩
-
Function
+關注
關注
0文章
14瀏覽量
9932 -
封裝器
+關注
關注
0文章
7瀏覽量
5902 -
invoke
+關注
關注
0文章
4瀏覽量
2012
原文標題:function與invoke的區別
文章出處:【微信號:程序喵大人,微信公眾號:程序喵大人】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論