程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++ TR1 Function Bind,tr1functionbind

C++ TR1 Function Bind,tr1functionbind

編輯:C++入門知識

C++ TR1 Function Bind,tr1functionbind


     在C++ 11出現以前,C++的事件一般是通過回調形試來實現,如 void (*func)(int,int,int),其實際上是一種函數指針,在C中調用時是直接寫函數名在參數列表中,而在C++中,大部份的回調需要定義成 static。也就是靜態函數。通過::作用域符,方式調用。

   當然在C++TR11出現前,更早的function 與Bind 在開源庫中boost 中就有,而C++11 tr1也就是借鑒了或者直接使用了boost庫中的相關模板。

 現在就來說說C++ tr1 中的Function 模板 比如 typedef std::tr1::function<long(const char*,unsigned int)>MSGEvent; 這個function 實際上就是以前的回調函數的定義,只是用了function模板後,你就可以像對象一樣操作,也為後面的bind提供方便。

  C++ tr1 bind 和boost的bind一樣,形式為bind(Function fn, T1 t1, T2 t2, …, TN tN); 前名是函數名,後面是參數。bind的好處在與你的聯接可以是全局函數,或者靜態函數,或者是類的成員函數,而不像以前的回調,只能用靜態函數。

 網上很多例子,可以看看 http://www.cnblogs.com/satng/archive/2011/04/29/2138804.html 

 


C++ Boost庫std::tr1::bind的使用問題

你聲明的時候用的是function,定義的時候怎麼用bind,還是用function跟聲明是一樣的。bind綁定的函數後返回的就是一個function對象。
 

javascript:對於Functionprototypebind()這個方法

Function.prototype.bind=function(thisArg){ var fn=this, slice=Array.prototype.slice, args=slice.call(arguments,1);//arguments1 var a1 = arguments; return function(){ alert(a1 == arguments);// 判斷是否為同一個 return fn.apply(thisArg,args.concat(slice.call(arguments)));//arguments2 }};((function(){}).bind())(2);// 總是alert出false不是。第一個arguments是只thisArg,第二個則是指返回的那個函數的arguments。

Function.prototype.bind=function(thisArg){ var fn=this, slice=Array.prototype.slice, args=slice.call(arguments,1);//arguments1 alert(arguments[0]);// alert出1 return function(){ alert(arguments[0]);// alert出2 return fn.apply(thisArg,args.concat(slice.call(arguments)));//arguments2 }};((function(){}).bind(1))(2);
 

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