程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> 懂得C++編程中的std::function函數封裝

懂得C++編程中的std::function函數封裝

編輯:關於C++

懂得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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved