1. 程式人生 > >C++11新特性,bind,基於對象

C++11新特性,bind,基於對象

實體 oca jci con data () ebr mrp ddd

function/bind:

std::function: ?std::function<R(T1, T2, ..., TN)>
?這是一個模板實現的函數對象類,它可以包裝其它任意的函數對象
,而被包裝的函數對象具有類型為T1,T2,…,TN的參數,其返回值為R類型
?function 對象的最大用處在於實現函數回調


bind: ?bind是這樣一種機制,它可以預先把指定可調用實體
的某些參數綁定到已有的變量,產生一個新的可調用實體 ?綁定的參數的個數不受限制 ?綁定的具體哪些參數也不受限制,由用戶指定 ?bind預先綁定的參數需要傳具體的變量或值進去,是pass-by-value(值傳遞)的 ?對於不事先綁定的參數,需要傳std::placeholders進去,從_1開始,依次遞增 ?bind的返回值是可調用實體,可以直接賦給std::function對象


面向對象 vs 基於對象: ?面向對象的三大特點(封裝,繼承,多態)缺一不可。 ?通常“基於對象”是使用對象,但是並不利用現有的對象模板產生新的對象類型,繼而產生新的對象,即“基於對象”沒有繼承的特點。 ?“面向對象”和“基於對象”都實現了“封裝”的概念,但是面向對象實現了“繼承和多態”,而“基於對象”沒有實現這些。
繼承(面向對象) vs 組合(基於對象)

// bind 返回一個新的可調用實體 // function 對象實現函數回調 #include<iostream> #include<functional> using namespace std; using std::function; //using std::placeholders; // namespace ‘std::placeholders’ not allowed in using-declaration using namespace std::placeholders; int func(int x,int y) { return x+y; } class A { public: int func(int x,int y) { return x+y; } };
int main() { // function<int(int,int)> test1 = bind(func,10,placeholders::_1); // 只有一個占位符,意思傳參只要傳一個,所以形參不能是兩個,和原函數沒關系 function<int(int)> test1 = bind(func,10,placeholders::_1); cout<<test1(20)<<endl;
A a; function<int(int)> test2 = bind(&A::func,&a,30,_1); // 前面聲明,就不用寫placeholders cout<<test2(40)<<endl;
function<int(int,int)> test3 = func; cout<<test3(10,20)<<endl;
//function<int(const A&,int,int)> test4 = &A::func; function<int(A&,int,int)> test4 = &A::func; // 今天腦子犯抽,const成員對象只能調用const修飾的成員函數 cout<<test4(a,10,20)<<endl; return 0; } 技術分享圖片





C++11新特性,bind,基於對象