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);
- 儲存lambda表示式
std::function<void()> func_1 = [](){cout<<"hello world"<<endl;};
func_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 中的function和bind、lambda用法
get foo 隱式轉換 function for_each sstream ios 無法 href std::function 1. std::bind綁定一個成員函數 1 #include <iostream> 2 #include
C++11 中std::function和std::bind的用法
關於std::function 的用法: 其實就可以理解成函式指標 1. 儲存自由函式 void printA(int a) { cout<<a<<endl; } std::function<void(int a)
C++11之std::function和std::bind
std::function是可呼叫物件的包裝器,它最重要的功能是實現延時呼叫: #include "stdafx.h" #include<iostream>// std::cout #include<functional>// std::fu
C++11新特性應用--實現延時求值(std::function和std::bind)
說是延時求值,注意還是想搞一搞std::function和std::bind。 現在就算是補充吧,再把std::bind進行討論討論。 何為Callable Objects? 即可呼叫物件,比如函式指標、仿函式、類成員函式指標等都可稱為可呼叫物件。
C++11 std::function和std::bind繫結器
前言 C++11增加了std::function和std::bind,使得使用標準庫函式時變得方便,而且還能方便地實現延遲求值。C++中,存在“可呼叫物件”這麼一個概念。準確來說,可呼叫物件有如下的定
使用std::function和std::bind寫的觀察者模式
最近由於學cocos2d-x3.2,看到其中的回撥函式使用了std::bind,發現這是一個挺有趣的東西,它可以繫結一個函式,甚至一個函式物件,生成一個綁定了函式引數的函式物件,所以嘗試用它寫了一下觀察者模式。 首先是觀察者單例: Ref是模仿cocos2d-x寫的一個包
關於std::function和std::bind繫結成員函式
關於std::bind繫結成員函式與虛擬函式的方法。 #include <iostream> #include <functional> using namespace std; class A { public: A() :m_a(0)
使用std::function和std::bind實現區域性函式做回撥
昨日的求教得到了大家的熱烈迴應,除了要我解釋友圈封面之外,也有很多牛人給了很棒的指導意見,其中最為有效的是說使用std::function加std::bind,今晚我就實驗一下. 這兩個東西是c++11的東西,std::function,抄襲別人的理解就是
c++11中condition_variable訊號量的標準用法。
目標:主執行緒向其它執行緒發生訊息,其它執行緒收到訊息並處理。 虛擬碼目標:主執行緒將訊息加入listTemp連結串列,使用condition_variable的notify_one通知執行緒,其它執行緒將訊息處理,並將訊息加入到已處理listTemp2連結串列中。 虛擬
C++中的仿函式,std::function和bind()的用法
1.仿函式:又叫std::function,是C++中的一個模板類 2.C語言中的函式指標: int add(int a,int b) { return a+b; } typedef int (*func)(int,int);//給函式型別定義別名
《深入應用C++11》筆記-std::function和bind
接下來的內容將會補充在《深入理解C++11》書中沒有涉及的一些比較常用的特性,內容取自《深入應用C++11》。 在C++中,存在“可呼叫物件(Callable Objects)”這麼一個概念。準確來說,可呼叫物件有如下幾種定義: 是一個函式指標。 是一
C++11中的技術剖析( std bind原理簡單圖解)
簡化 靜態成員函數 div 語法 con mar clear 函數 多余 此文為轉載,好像原出處的原文已經無法打開了。 本文解釋了bind 是如何工作的。為了清晰,我對圖中的語法作了一些簡化(例如,省略函數調用操作符的參數類型),並且簡化了 bind 的實現. bin
執行緒與互斥鎖(C++11中std::thread和std::mutex的用法)
執行緒 0 首先是曾經在MultiCMOS專案中用到的: #include <thread> //包含標頭檔案 class IDataProcessUnit { protected:
實戰c++中的vector系列--對vector<自己定義類>使用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::map和std::unordered_map中的新增操作
std::map和std::unordered_map主要提供如下幾種新增操作: try_emplace () (C++17) emplace () insert() [] = 下面給出一段測試程式碼,觀察物件在新增到std::map中時,
C++11中std condition variable的使用
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
C++11中std move的使用
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
C++中的std::lock_guard和std::unique_lock
std::lock_guard 這是最簡單的一個管理鎖的物件。只有構造和解構函式,在構造的時候加鎖,析構的時候解鎖,解鎖後就不能使用該物件再加鎖了。可以避免使用std::mutex時忘記解鎖的情況,同時可以方便處理異常。 簡單的例項: #include <iostrea
c++11 std::future和std::async
std::future可以從非同步任務中獲取結果,一般與std::async配合使用,std::async用於建立非同步任務,實際上就是建立一個執行緒執行相應任務。 使用程式碼如下: #include <future> #include <iostre