C++11新特性,bind,基於對象
阿新 • • 發佈:2018-07-25
實體 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 組合(基於對象)
std::function: ?std::function<R(T1, T2, ..., TN)>
?這是一個模板實現的函數對象類,它可以包裝其它任意的函數對象
?function 對象的最大用處在於實現函數回調
bind: ?bind是這樣一種機制,它可以預先把指定可調用實體
面向對象 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,基於對象