1. 程式人生 > >C++11 中std::function和std::bind的用法

C++11 中std::function和std::bind的用法

關於std::function 的用法:
其實就可以理解成函式指標
1. 儲存自由函式

void printA(int a)
{
    cout<<a<<endl;
}

std::function<void(int a)> func;
func = printA;
func(2);
  1. 儲存lambda表示式
std::function<void()> func_1 = [](){cout<<"hello world"<<endl;};
func_1();
  1. 儲存成員函式
struct Foo {
    Foo(int
num) : num_(num) {} void print_add(int i) const { cout << num_+i << '\n'; } int num_; }; // 儲存成員函式 std::function<void(const Foo&, int)> f_add_display = &Foo::print_add; Foo foo(2); f_add_display(foo, 1);

在實際使用中都用 auto 關鍵字來代替std::function… 這一長串了。

關於std::bind 的用法:


看一系列的文字,不如看一段程式碼理解的快

#include <iostream>
using namespace std;
class A
{
public:
    void fun_3(int k,int m)
    {
        cout<<k<<" "<<m<<endl;
    }
};

void fun(int x,int y,int z)
{
    cout<<x<<"  "<<y<<"  "<<z<<endl;
}

void fun_2(int
&a,int &b) { a++; b++; cout<<a<<" "<<b<<endl; } int main(int argc, const char * argv[]) { auto f1 = std::bind(fun,1,2,3); //表示繫結函式 fun 的第一,二,三個引數值為: 1 2 3 f1(); //print:1 2 3 auto f2 = std::bind(fun, placeholders::_1,placeholders::_2,3); //表示繫結函式 fun 的第三個引數為 3,而fun 的第一,二個引數分別有呼叫 f2 的第一,二個引數指定 f2(1,2);//print:1 2 3 auto f3 = std::bind(fun,placeholders::_2,placeholders::_1,3); //表示繫結函式 fun 的第三個引數為 3,而fun 的第一,二個引數分別有呼叫 f3 的第二,一個引數指定 //注意: f2 和 f3 的區別。 f3(1,2);//print:2 1 3 int n = 2; int m = 3; auto f4 = std::bind(fun_2, n,placeholders::_1); f4(m); //print:3 4 cout<<m<<endl;//print:4 說明:bind對於不事先繫結的引數,通過std::placeholders傳遞的引數是通過引用傳遞的 cout<<n<<endl;//print:2 說明:bind對於預先繫結的函式引數是通過值傳遞的 A a; auto f5 = std::bind(&A::fun_3, a,placeholders::_1,placeholders::_2); f5(10,20);//print:10 20 std::function<void(int,int)> fc = std::bind(&A::fun_3, a,std::placeholders::_1,std::placeholders::_2); fc(10,20);//print:10 20 return 0; }

相關推薦

C++11 functionbind、lambda用法

get foo 隱式轉換 function for_each sstream ios 無法 href std::function 1. std::bind綁定一個成員函數 1 #include <iostream> 2 #include

C++11 std::functionstd::bind用法

關於std::function 的用法: 其實就可以理解成函式指標 1. 儲存自由函式 void printA(int a) { cout<<a<<endl; } std::function<void(int a)

C++11std::functionstd::bind

std::function是可呼叫物件的包裝器,它最重要的功能是實現延時呼叫: #include "stdafx.h" #include<iostream>// std::cout #include<functional>// std::fu

C++11新特性應用--實現延時求值(std::functionstd::bind)

說是延時求值,注意還是想搞一搞std::function和std::bind。 現在就算是補充吧,再把std::bind進行討論討論。 何為Callable Objects? 即可呼叫物件,比如函式指標、仿函式、類成員函式指標等都可稱為可呼叫物件。

C++11 std::functionstd::bind繫結器

前言 C++11增加了std::function和std::bind,使得使用標準庫函式時變得方便,而且還能方便地實現延遲求值。C++中,存在“可呼叫物件”這麼一個概念。準確來說,可呼叫物件有如下的定

使用std::functionstd::bind寫的觀察者模式

最近由於學cocos2d-x3.2,看到其中的回撥函式使用了std::bind,發現這是一個挺有趣的東西,它可以繫結一個函式,甚至一個函式物件,生成一個綁定了函式引數的函式物件,所以嘗試用它寫了一下觀察者模式。 首先是觀察者單例: Ref是模仿cocos2d-x寫的一個包

關於std::functionstd::bind繫結成員函式

關於std::bind繫結成員函式與虛擬函式的方法。 #include <iostream> #include <functional> using namespace std; class A { public:     A() :m_a(0)

使用std::functionstd::bind實現區域性函式做回撥

昨日的求教得到了大家的熱烈迴應,除了要我解釋友圈封面之外,也有很多牛人給了很棒的指導意見,其中最為有效的是說使用std::function加std::bind,今晚我就實驗一下.          這兩個東西是c++11的東西,std::function,抄襲別人的理解就是

c++11condition_variable訊號量的標準用法

目標:主執行緒向其它執行緒發生訊息,其它執行緒收到訊息並處理。 虛擬碼目標:主執行緒將訊息加入listTemp連結串列,使用condition_variable的notify_one通知執行緒,其它執行緒將訊息處理,並將訊息加入到已處理listTemp2連結串列中。  虛擬

C++的仿函式,std::functionbind()的用法

1.仿函式:又叫std::function,是C++中的一個模板類 2.C語言中的函式指標: int  add(int a,int b) {   return a+b; } typedef int (*func)(int,int);//給函式型別定義別名

《深入應用C++11》筆記-std::functionbind

接下來的內容將會補充在《深入理解C++11》書中沒有涉及的一些比較常用的特性,內容取自《深入應用C++11》。 在C++中,存在“可呼叫物件(Callable Objects)”這麼一個概念。準確來說,可呼叫物件有如下幾種定義: 是一個函式指標。 是一

C++11的技術剖析( std bind原理簡單圖解)

簡化 靜態成員函數 div 語法 con mar clear 函數 多余 此文為轉載,好像原出處的原文已經無法打開了。 本文解釋了bind 是如何工作的。為了清晰,我對圖中的語法作了一些簡化(例如,省略函數調用操作符的參數類型),並且簡化了 bind 的實現. bin

執行緒與互斥鎖(C++11std::threadstd::mutex的用法

執行緒 0 首先是曾經在MultiCMOS專案中用到的: #include <thread> //包含標頭檔案 class IDataProcessUnit { protected:

實戰c++的vector系列--對vector&lt;自己定義類&gt;使用std::find std::find_if 算法

++ pac price key fadein 輸出 var getitem mod 之前博客講了一些關於std::find和std::find_ if的一些使用方法。可是沒有講述對於vector中存儲的是自己定義的類。那麽怎麽樣使用std::find和

c++11 標準庫函數 std::move 完美轉發 std::forward

標準庫函數 這樣的 除了 值引用 sin 引入 語言 優先 ace c++11 標準庫函數 std::move 和 完美轉發 std::forward #define _CRT_SECURE_NO_WARNINGS #include <iostream>

C++:探索std::mapstd::unordered_map的新增操作

std::map和std::unordered_map主要提供如下幾種新增操作: try_emplace ()   (C++17) emplace () insert() [] = 下面給出一段測試程式碼,觀察物件在新增到std::map中時,

C++11std condition variable的使用

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

C++11std move的使用

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

C++std::lock_guardstd::unique_lock

std::lock_guard 這是最簡單的一個管理鎖的物件。只有構造和解構函式,在構造的時候加鎖,析構的時候解鎖,解鎖後就不能使用該物件再加鎖了。可以避免使用std::mutex時忘記解鎖的情況,同時可以方便處理異常。 簡單的例項: #include <iostrea

c++11 std::futurestd::async

std::future可以從非同步任務中獲取結果,一般與std::async配合使用,std::async用於建立非同步任務,實際上就是建立一個執行緒執行相應任務。    使用程式碼如下: #include <future> #include <iostre