C++11 學習筆記之std::function和bind綁定器
std::function
C++中的可調用對象雖然具有比較統(tǒng)一操作形式(除了類成員指針之外,都是后面加括號進行調用),但定義方法五花八門。為了統(tǒng)一泛化函數對象,函數指針,引用函數,成員函數的指針的各種操作,讓我們可以按更統(tǒng)一的方式寫出更加泛化的代碼,C++11推出了std::function。
std::function是可調用對象的包裝器。它是一個類模板,可以容納除了類成員(函數)指針之外的所有可調用對象。通過指定它的模板參數,它可以用統(tǒng)一的方式處理函數,函數對象,函數指針,并允許保存和延遲執(zhí)行它們。
1.1 可調用對象(Callable Objects)
可調用對象有如下幾種:
- 函數指針
- 具有operator()成員函數的類對象(仿函數)
- 可被轉換為函數指針的類對象
- 類成員(函數)指針
以上涉及的對象可以像一個函數一樣做調用操作,統(tǒng)稱為可調用對象。現在,C++11通過提供std::function和std::bind統(tǒng)一了可調用對象的各種操作。
1.2 可調用對象包裝器——std::function
C++中的可調用對象雖然具有比較統(tǒng)一操作形式(除了類成員指針之外,都是后面加括號進行調用),但定義方法五花八門。為了統(tǒng)一泛化函數對象,函數指針,引用函數,成員函數的指針的各種操作,讓我們可以按更統(tǒng)一的方式寫出更加泛化的代碼,C++11推出了std::function。
std::function是可調用對象的包裝器。它是一個類模板,可以容納除了類成員(函數)指針之外的所有可調用對象。通過指定它的模板參數,它可以用統(tǒng)一的方式處理函數,函數對象,函數指針,并允許保存和延遲執(zhí)行它們。
#include <iostream>
#include <functional>
using namespace std;
void func(void){
cout << __FUNCTION__ <<endl;
}
class Foo
{
public:
static int foo_func(int a){
cout << __FUNCTION__ << "(" << a << ") ->: ";
return a;
}
};
class Bar
{
public:
int operator()(int a){
cout << __FUNCTION__ << "(" << a << ") ->: ";
return a;
}
};
int main(){
//綁定一個普通函數
std::function<void(void)> fry = func;
fry();
//綁定一個類的靜態(tài)成員函數
std::function<int(int)> fr2 = Foo::foo_func;
cout << fr2(123) << endl;
//綁定一個仿函數
Bar bar;
fr2 = bar;
cout << fr2(123) <<endl;
return 0;
}
root@ubuntu:~/c++# g++ -std=c++11 func1.cpp -o func root@ubuntu:~/c++# ./func func foo_func(123) ->: 123 operator()(123) ->: 123 root@ubuntu:~/c++#
std::function的使用方法:我們給std::function填入合適的函數簽名(即一個函數類型,只需要包括返回值和參數表)之后,它就變成了一個可以容納所有這一類調用方式的“函數包裝器”。
#include <iostream>
#include <functional>
using namespace std;
class A
{
public:
A(const std::function<void()>& f) :callback_(f){}
void notify(void){
callback_();
}
private:
std::function<void()> callback_;
};
class Foo
{
public:
void operator()(void){
cout <<"in " << __FUNCTION__<< endl;
}
};
int main(){
Foo foo;
A aa(foo);
aa.notify();
return 0;
}
"func2.cpp" 32L, 452C written root@ubuntu:~/c++# g++ -std=c++11 func2.cpp -o func root@ubuntu:~/c++# ./func in operator()
C++11 std::function 是一種通用、多態(tài)的函數封裝,它的實例可以對任何可以調用的目標實體進行存儲、復制和調用操作,它也是對 C++中現有的可調用實體的一種類型安全的包裹(相對來說,函數指針的調用不是類型安全的),換句話說,就是函數的容器。當我們有了函數的容器之后便能夠更加方便的將函數、函數指針作為對象進行處理。例如:lambda函數
到此這篇關于C++11 學習筆記之std::function和bind綁定器的文章就介紹到這了,更多相關C++11 std::function和bind綁定器內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

