国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > C++ > 正文

理解C++編程中的std::function函數(shù)封裝

2020-01-26 14:38:06
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

先來(lái)看看下面這兩行代碼:

std::function<void(EventKeyboard::KeyCode, Event*)> onKeyPressed;std::function<void(EventKeyboard::KeyCode, Event*)> onKeyReleased;

這兩行代碼是從Cocos2d-x中摘出來(lái)的,重點(diǎn)是這兩行代碼的定義啊。std::function這是什么東西?如果你對(duì)上述兩行代碼表示毫無(wú)壓力,那就不妨再看看本文,就當(dāng)溫故而知新吧。

std::function介紹
類(lèi)模版std::function是一種通用、多態(tài)的函數(shù)封裝。std::function的實(shí)例可以對(duì)任何可以調(diào)用的目標(biāo)實(shí)體進(jìn)行存儲(chǔ)、復(fù)制、和調(diào)用操作,這些目標(biāo)實(shí)體包括普通函數(shù)、Lambda表達(dá)式、函數(shù)指針、以及其它函數(shù)對(duì)象等。std::function對(duì)象是對(duì)C++中現(xiàn)有的可調(diào)用實(shí)體的一種類(lèi)型安全的包裹(我們知道像函數(shù)指針這類(lèi)可調(diào)用實(shí)體,是類(lèi)型不安全的)。

通常std::function是一個(gè)函數(shù)對(duì)象類(lèi),它包裝其它任意的函數(shù)對(duì)象,被包裝的函數(shù)對(duì)象具有類(lèi)型為T(mén)1, …,TN的N個(gè)參數(shù),并且返回一個(gè)可轉(zhuǎn)換到R類(lèi)型的值。std::function使用 模板轉(zhuǎn)換構(gòu)造函數(shù)接收被包裝的函數(shù)對(duì)象;特別是,閉包類(lèi)型可以隱式地轉(zhuǎn)換為std::function。

最簡(jiǎn)單的理解就是:

通過(guò)std::function對(duì)C++中各種可調(diào)用實(shí)體(普通函數(shù)、Lambda表達(dá)式、函數(shù)指針、以及其它函數(shù)對(duì)象等)的封裝,形成一個(gè)新的可調(diào)用的std::function對(duì)象;讓我們不再糾結(jié)那么多的可調(diào)用實(shí)體。一切變的簡(jiǎn)單粗暴。
好用并實(shí)用的東西才會(huì)加入標(biāo)準(zhǔn)的。因?yàn)楹糜?,?shí)用,我們才在項(xiàng)目中使用它。std::function實(shí)現(xiàn)了一套類(lèi)型消除機(jī)制,可以統(tǒng)一處理不同的函數(shù)對(duì)象類(lèi)型。以前我們使用函數(shù)指針來(lái)完成這些;現(xiàn)在我們可以使用更安全的std::function來(lái)完成這些任務(wù)。

示例

#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(){  // 保存自由函數(shù)  std::function<void(int)> f_display = print_num;  f_display(-9);   // 保存 lambda 表達(dá)式  std::function<void()> f_display_42 = []() { print_num(42); };  f_display_42();   // 保存 std::bind 的結(jié)果  std::function<void()> f_display_31337 = std::bind(print_num, 31337);  f_display_31337();   // 保存成員函數(shù)  std::function<void(const Foo&, int)> f_add_display = &Foo::print_add;  Foo foo(314159);  f_add_display(foo, 1);   // 保存成員函數(shù)和對(duì)象  using std::placeholders::_1;  std::function<void(int)> f_add_display2= std::bind( &Foo::print_add, foo, _1 );  f_add_display2(2);   // 保存成員函數(shù)和對(duì)象指針  std::function<void(int)> f_add_display3= std::bind( &Foo::print_add, &foo, _1 );  f_add_display3(3);   // 保存函數(shù)對(duì)象  std::function<void(int)> f_display_obj = PrintNum();  f_display_obj(18);}

輸出:

-9423133731416031416131416218

發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 秦安县| 土默特左旗| 文山县| 吴川市| 红河县| 南川市| 正安县| 十堰市| 大同县| 开远市| 长沙市| 晋州市| 定远县| 永春县| 海丰县| 宁海县| 定陶县| 鄂伦春自治旗| 东城区| 樟树市| 喀喇沁旗| 井研县| 武平县| 峨边| 哈巴河县| 衡东县| 望谟县| 巴里| 乡城县| 新兴县| 沐川县| 墨竹工卡县| 海原县| 丰台区| 新竹县| 遂宁市| 绥芬河市| 泌阳县| 永丰县| 开远市| 六盘水市|