在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
你聲明的時候用的是function,定義的時候怎麼用bind,還是用function跟聲明是一樣的。bind綁定的函數後返回的就是一個function對象。
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);