1. 程式人生 > >std::function與std::bind 函式指標

std::function與std::bind 函式指標

function模板類和bind模板函式,使用它們可以實現類似函式指標的功能,但卻卻比函式指標更加靈活,特別是函式指向類 的非靜態成員函式時。

std::function可以繫結到全域性函式/類靜態成員函式(類靜態成員函式與全域性函式沒有區別),如果要繫結到類的非靜態成員函式,則需要使用std::bind。

#include <iostream>
#include <functional>
using namespace std;

typedef std::function<void ()> fp;
void g_fun()
{
	cout<<"g_fun()"<<endl;
}
class A
{
public:
	static void A_fun_static()
	{
		cout<<"A_fun_static()"<<endl;
	}
	void A_fun()
	{
		cout<<"A_fun()"<<endl;
	}
	void A_fun_int(int i)
	{
		cout<<"A_fun_int() "<<i<<endl;
	}

	//非靜態類成員,因為含有this指標,所以需要使用bind
	void init()
	{
		fp fp1=std::bind(&A::A_fun,this);
		fp1();
	}

	void init2()
	{
		typedef std::function<void (int)> fpi;
		//對於引數要使用佔位符 std::placeholders::_1
		fpi f=std::bind(&A::A_fun_int,this,std::placeholders::_1);
		f(5);
	}
};
int main()
{
	//繫結到全域性函式
	fp f2=fp(&g_fun);
	f2();

	//繫結到類靜態成員函式
	fp f1=fp(&A::A_fun_static);
	f1();

	A().init();
	A().init2();
	return 0;
}

同時,std::bind繫結到虛擬函式時會表現出多型行為。
#include <iostream>
#include <functional>
using namespace std;

typedef std::function<void ()> fp;

class A
{
public:
	virtual void f()
	{
		cout<<"A::f()"<<endl;
	}

	void init()
	{
		//std::bind可以表現出多型行為
		fp f=std::bind(&A::f,this);
		f();
	}
};
class B:public A
{
public:
	virtual void f()
	{
		cout<<"B::f()"<<endl;
	}
};
int main()
{
	A* pa=new B;
	pa->init();

	return 0;
}


相關推薦

std::functionstd::bind 函式指標

function模板類和bind模板函式,使用它們可以實現類似函式指標的功能,但卻卻比函式指標更加靈活,特別是函式指向類 的非靜態成員函式時。 std::function可以繫結到全域性函式/類靜態成員函式(類靜態成員函式與全域性函式沒有區別),如果要繫結到類的非靜態成

關於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,抄襲別人的理解就是

std::function回撥類

std::function是c++11中提供的Callable類,所以本篇文章中整理了function的使用方式,及以function為基礎封裝回調類。 1. function的使用 #include <iostream> #include <string>

C++11之std::functionstd::bind

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

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

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

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

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

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::stringstd::wstring互相轉換

ret bst csdn 文章 result del set size_t amp 作者:zzandyc來源:CSDN原文:https ://blog.csdn.net/zzandyc/article/details/77540056 版權聲明:本文為博主原創文章,轉載請附

std::setstd::multiset使用總結

Set和Multiset   Set和Multiset都會根據特定的排序準則,自動將元素排序,兩者不同在於multiset允許元素重複,而set不允許元素重複。   Set和Multiset的使用均需要包含標頭檔案<set> #include<set>

C++ 11 多執行緒下std::unique_lockstd::lock_guard的區別和用法

這裡主要介紹std::unique_lock與std::lock_guard的區別用法 先說簡單的 一、std::lock_guard的用法 std::lock_guard其實就是簡單的RAII封裝,在建構函式中進行加鎖,解構函式中進行解鎖,這樣可以保證函式退出時,鎖一定被釋放。 簡單來說,就是防止開

寬字元(unicode)和多位元組的轉換(std::stringstd::wstring轉換)

#include <string> #include <windows.h> using namespace std; //Converting a WChar string to a Ansi string std::string W

C++11 std::unique_lockstd::lock_guard區別及多執行緒應用例項

C++多執行緒程式設計中通常會對共享的資料進行防寫,以防止多執行緒在對共享資料成員進行讀寫時造成資源爭搶導致程式出現未定義的行為。通常的做法是在修改共享資料成員的時候進行加鎖--mutex。在使用鎖的時候通常是在對共享資料進行修改之前進行lock操作,在寫完之後再進行unl

c++11的lambda表示式傳統的函式指標

#include <iostream> using namespace std; #include <functional> //std::function 標頭檔案 //傳統的函式指標 typedef int(*fun0)(int n); int

C++11 std::unique_lockstd::lock_guard區別

C++多執行緒程式設計中通常會對共享的資料進行防寫,以防止多執行緒在對共享資料成員進行讀寫時造成資源爭搶導致程式出現未定義的行為。通常的做法是在修改共享資料成員的時候進行加鎖--mutex。在使用鎖的時候通常是在對共享資料進行修改之前進行lock操作,在寫完之後再進行unlock操作,進場會出現由於

機器學習 徑向基(Radial basis function)RBF核函式 淺析

徑向基函式(RBF)在神經網路領域扮演著重要的角色,如 RBF神經網路具有唯一最佳逼近的特性,徑向基作為核函式在SVM中能將輸入樣本對映到高維特徵空間,解決一些原本線性不可分的問題。       本文主要討論:        1. 先討論核函式是如何把資料對映到高維空

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

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

c++中的std::bindstd::function

最近在看《深入應用c++11》的時候遇到了std::bind的一些新用法,之前沒有遇到過,這裡記錄下。通常時候std::bind是與std::function一起結合使用的,std::bind是一個函式模板,而std::function是一個類模板,這個從其原始

第11課 std::bindstd::function(2)_std::bind綁定器

pan std name iostream emf end cnblogs left eid 1. 溫故知新:std::bind1st和std::bind2nd (1)bind1st、bind2nd首先它們都是函數模板,用於將參數綁定到可調用對象(如函數、仿函數等)的第1個