類模板 std::function 是通用多態函式封裝器。 std::function 的例項能儲存、複製及呼叫任何可呼叫物件。c++語言中有多種可呼叫物件:函式、函式指標、lambda表示式、bind建立的物件以及過載了函式呼叫運算子的類(仿函式)等。
和其他物件一樣,可呼叫物件也有型別。如:每個lambda有它自己唯一的(未命名)類型別;函式及函式指標的型別則由其返回值型別和實參型別決定。然而,不同型別的可呼叫物件可能共享同一種呼叫形式。呼叫形式指明了返回的型別以及傳遞給呼叫的實參型別。一種呼叫形式對應乙個函式(function)型別,如:
int(int,int)
是乙個函式型別,它接受兩個int,返回乙個int。
通過std::function,我們可以把可呼叫物件包裝為更通用的形式。參照《c++ primer》上計算器的例子:
#include #include #include #include //函式
int add(int a, int b)
//lambda
auto mod = (int a, int b) ;
//仿函式
struct divide
};int main()
, //函式指標
, //標準庫函式物件
, //使用者定義的函式物件
}, //未命名的lambda
//命名的lambda
}; cout << "3+2=" << binops["+"](3, 2) << endl;
cout << "3-2=" << binops["-"](3, 2) << endl;
cout << "3/2=" << binops["/"](3, 2) << endl;
cout << "3*2=" << binops["*"](3, 2) << endl;
cout << "3%2=" << binops["%"](3, 2) << endl;
system("pause");
return 0;
}
對於過載函式,我們不能直接將過載函式的名字存入function型別的物件中,可用函式指標或lambda來解決。
//過載的函式
int add(int a, int b)
std::string add(std::string a, std::string b)
//add_p接收int版本的函式
int (*add_p)(int, int) = add;
binops.insert();
//或者使用lambda
binops.insert( });
#include #include struct foo
void print_add(int i) const
int num_;};
void print_num(int i)
struct printnum };
int main()
; f_display_42();
// 儲存到 std::bind 呼叫的結果
std::functionf_display_31337 = std::bind(print_num, 31337);
f_display_31337();
// 儲存到成員函式的呼叫
std::functionf_add_display = &foo::print_add;
const foo foo(314159);
f_add_display(foo, 1);
f_add_display(314159, 1);
// 儲存到資料成員訪問器的呼叫
std::functionf_num = &foo::num_;
std::cout << "num_: " << f_num(foo) << '\n';
// 儲存到成員函式及物件的呼叫
using std::placeholders::_1;
std::functionf_add_display2 = std::bind( &foo::print_add, foo, _1 );
f_add_display2(2);
// 儲存到成員函式和物件指標的呼叫
std::functionf_add_display3 = std::bind( &foo::print_add, &foo, _1 );
f_add_display3(3);
// 儲存到函式物件的呼叫
std::functionf_display_obj = printnum();
f_display_obj(18);
}
python函式巢狀閉包 閉包與巢狀函式
沒有區別,因為沒有閉合函式,不是真的。有closures,但這一術語指的是在外部和內部範圍中儲存變數的技術。只剩下巢狀函式。在 巢狀函式只是在另乙個函式內部定義的函式 def outer def inner 當outer 定義了乙個inner 然後也使用的名稱,則該變數名稱為閉包單元,儲存在inne...
閉包 匿名函式 函式宣告
1 簡單的描述閉包 如果在函式func內部宣告函式inner,然後在函式外部呼叫inner,這個過程即產生了乙個閉包。1 閉包是指 有權訪問另乙個函式作用域中的變數的函式。2 閉包與變數 作用域鏈引出的乙個 閉包只能取得包含函式中任何變數的最後乙個值。閉包所儲存的是整個變數物件,而不是某個特殊的變數...
高階函式 閉包 延遲函式
1.在 js 裡,函式是一等公民,可以作為函式的返回值,也可以作為函式的引數 判斷乙個引數是否是字串 function isstring param 判斷乙個引數是否是陣列 function isarray param console.log isstring console.log isarray...