生活随笔
收集整理的這篇文章主要介紹了
C++ function关键字
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
function是一組函數對象包裝類的模板,實現了一個泛型的回調機制。
引入頭文件
#include <functional>
using namespace std;
using namespace std::placeholders; ?//bind的時候會用`
參考:http://www.cnblogs.com/hujian/archive/2012/12/07/2807605.html
fuction ?bind:http://blog.csdn.net/fjb2080/article/details/7527715
我們可以調用的對象有很多,比如普通函數、函數指針、lanmbda表達式、函數對象和類的成員函數等。
不管采用哪種方式,主要調用形式一樣(返回值類型、傳遞給調用的實參類型),我們就可以使用同一種形式來調用。
這個時候就可以用到function模板,它給予我們在調用的方式上更大的彈性。
請看一下三種不同的函數定義:
[cpp] view plain copy print? int?add(int?a,?int?b){??????return?a+b;??}??auto?mod=[](int?a,?int?b){return?a%b;};??struct?divide{??????int?operator()(int?m,?int?n){??????????return?m/n;??????}??};??
這三種都可以使用同一種調用形式,int(int, int),調用方式如下:
[cpp] view plain copy print? function<int(int,int)>?func1=?add;??function<int(int,int)>?func2=?divide();??function<int(int,int)>?func3=?mod;??cout<<func1(5,?6)<<endl;??cout<<func2(5,?6)<<endl;??cout<<func3(5,?6)<<endl;??
學會了使用function,可以繼續如下進行抽象定義,不同類型采用相同的調用方法:
[cpp] view plain copy print? map<string,function<int(int,?int)>>?funs?=??{??????{"+",?add},??????{"-",?std::minus<int>()},??????{"/",?divide()},??????{"*",?[](int?i,int?j){return?i*j;}},??????{"%",?mod},??};??funs["+"](4,6);??
以上就是function的簡單使用。下面是從另一篇博客轉載的,使用function的引用來保存函數對象。考慮下面代碼:
[cpp] view plain copy print? class?CAdd??{??public:??????CAdd():m_nSum(0){NULL;}??????int?operator()(int?i)??????{??????????m_nSum?+=?i;??????????return?m_nSum;??????}????????????int?Sum()?const??????{??????????return?m_nSum;??????}????????private:??????int?m_nSum;??};??int?main(int?argc,?const?char?*?argv[])??{??????CAdd?cAdd;??????function<int(int)>?funcAdd1?=?cAdd;??????function<int(int)>?funcAdd2?=?cAdd;??????cout<<funcAdd1(10)<<endl;??????cout<<funcAdd2(10)<<endl;??????cout<<cAdd.Sum()<<endl;?????????????return?0;??}??
上面的輸出結果是 10 10 0。我們將同一個函數對象賦值給了兩個function,然后分別調用這兩個function,但函數中的成員變量的值沒有保存,問題在哪里?因為function的缺省行為是拷貝一份傳遞給它的函數對象,于是f1,f2中保存的都是cAdd對象的拷貝。
C++11提供了ref和cref函數來提供對象的引用和常引用的包裝。要是function能夠正確保存函數對象的狀態,可以如下修改代碼:
[cpp] view plain copy print? function<int(int)>?funcAdd3?=?ref(cAdd);??function<int(int)>?funcAdd4?=?ref(cAdd);??cout<<funcAdd3(10)<<endl;??cout<<funcAdd4(10)<<endl;??cout<<cAdd.Sum()<<endl;??
? ? ? ? 另外,兩個function之間賦值時,如果源function保存的是函數對象的拷貝,則目標function保存的也是函數對象的拷貝。如果源function保存的是對函數對象的引用,則目標function保存的也是函數對象的引用。
總結
以上是生活随笔為你收集整理的C++ function关键字的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。