懂得C++編程中的std::function函數封裝。本站提示廣大學習愛好者:(懂得C++編程中的std::function函數封裝)文章只能為提供參考,不一定能成為您想要的結果。以下是懂得C++編程中的std::function函數封裝正文
先來看看上面這兩行代碼:
std::function<void(EventKeyboard::KeyCode, Event*)> onKeyPressed; std::function<void(EventKeyboard::KeyCode, Event*)> onKeyReleased;
這兩行代碼是從Cocos2d-x中摘出來的,重點是這兩行代碼的界說啊。std::function這是甚麼器械?假如你對上述兩行代碼表現毫無壓力,那就無妨再看看本文,就當溫故而知新吧。
std::function引見
類模版std::function是一種通用、多態的函數封裝。std::function的實例可以對任何可以挪用的目的實體停止存儲、復制、和挪用操作,這些目的實體包含通俗函數、Lambda表達式、函數指針、和其它函數對象等。std::function對象是對C++中現有的可挪用實體的一品種型平安的包裹(我們曉得像函數指針這類可挪用實體,是類型不平安的)。
平日std::function是一個函數對象類,它包裝其它隨意率性的函數對象,被包裝的函數對象具有類型為T1, …,TN的N個參數,而且前往一個可轉換到R類型的值。std::function應用 模板轉換結構函數吸收被包裝的函數對象;特殊是,閉包類型可以隱式地轉換為std::function。
最簡略的懂得就是:
經由過程std::function對C++中各類可挪用實體(通俗函數、Lambda表達式、函數指針、和其它函數對象等)的封裝,構成一個新的可挪用的std::function對象;讓我們不再糾結那末多的可挪用實體。一切變的簡略粗魯。
好用並適用的器械才會參加尺度的。由於好用,適用,我們才在項目中應用它。std::function完成了一套類型清除機制,可以同一處置分歧的函數對象類型。之前我們應用函數指針來完成這些;如今我們可使用更平安的std::function來完成這些義務。
示例
#include <functional> #include <iostream> struct Foo { Foo(int num) : num_(num) {} void print_add(int i) const { std::cout << num_+i << '\n'; } int num_; }; void print_num(int i) { std::cout << i << '\n'; } struct PrintNum { void operator()(int i) const { std::cout << i << '\n'; } }; int main() { // 保留自在函數 std::function<void(int)> f_display = print_num; f_display(-9); // 保留 lambda 表達式 std::function<void()> f_display_42 = []() { print_num(42); }; f_display_42(); // 保留 std::bind 的成果 std::function<void()> f_display_31337 = std::bind(print_num, 31337); f_display_31337(); // 保留成員函數 std::function<void(const Foo&, int)> f_add_display = &Foo::print_add; Foo foo(314159); f_add_display(foo, 1); // 保留成員函數和對象 using std::placeholders::_1; std::function<void(int)> f_add_display2= std::bind( &Foo::print_add, foo, _1 ); f_add_display2(2); // 保留成員函數和對象指針 std::function<void(int)> f_add_display3= std::bind( &Foo::print_add, &foo, _1 ); f_add_display3(3); // 保留函數對象 std::function<void(int)> f_display_obj = PrintNum(); f_display_obj(18); }
輸入:
-9 42 31337 314160 314161 314162 18