C std function函式包裝器

2021-10-04 12:39:47 字數 2430 閱讀 7474

類模板 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...