std::cunction() 简单描述
function是一組函數(shù)對(duì)象包裝類的模板,實(shí)現(xiàn)了一個(gè)泛型的回調(diào)機(jī)制。
引入頭文件
#include <functional>
using namespace std;
using namespace std::placeholders; ?//bind的時(shí)候會(huì)用`
參考:http://www.cnblogs.com/hujian/archive/2012/12/07/2807605.html
fuction ?bind:http://blog.csdn.net/fjb2080/article/details/7527715
我們可以調(diào)用的對(duì)象有很多,比如普通函數(shù)、函數(shù)指針、lanmbda表達(dá)式、函數(shù)對(duì)象和類的成員函數(shù)等。
不管采用哪種方式,主要調(diào)用形式一樣(返回值類型、傳遞給調(diào)用的實(shí)參類型),我們就可以使用同一種形式來調(diào)用。
這個(gè)時(shí)候就可以用到function模板,它給予我們?cè)谡{(diào)用的方式上更大的彈性。
請(qǐng)看一下三種不同的函數(shù)定義:
[cpp] view plain copy這三種都可以使用同一種調(diào)用形式,int(int, int),調(diào)用方式如下:
[cpp] view plain copy學(xué)會(huì)了使用function,可以繼續(xù)如下進(jìn)行抽象定義,不同類型采用相同的調(diào)用方法: [cpp] view plain copy
以上就是function的簡(jiǎn)單使用。下面是從另一篇博客轉(zhuǎn)載的,使用function的引用來保存函數(shù)對(duì)象。考慮下面代碼: [cpp] view plain copy
上面的輸出結(jié)果是 10 10 0。我們將同一個(gè)函數(shù)對(duì)象賦值給了兩個(gè)function,然后分別調(diào)用這兩個(gè)function,但函數(shù)中的成員變量的值沒有保存,問題在哪里?因?yàn)閒unction的缺省行為是拷貝一份傳遞給它的函數(shù)對(duì)象,于是f1,f2中保存的都是cAdd對(duì)象的拷貝。
C++11提供了ref和cref函數(shù)來提供對(duì)象的引用和常引用的包裝。要是function能夠正確保存函數(shù)對(duì)象的狀態(tài),可以如下修改代碼:
[cpp] view plain copy
//=====================================================================
? cplusplus.com:http://www.cplusplus.com/reference/functional/function/
? cppreference.com:http://en.cppreference.com/w/cpp/utility/functional/function
std::function簡(jiǎn)介
? 類模板聲明
// MS C++ 2013 template<class _Fty> class function; template<class _Fty> class function : public _Get_function_impl<_Fty>::type { ... }// GCC 4.8.2 template<typename _Signature> class function; template<typename _Res, typename... _ArgTypes> class function<_Res(_ArgTypes...)>: public _Maybe_unary_or_binary_function<_Res, _ArgTypes...>, private _Function_base { ... }// cplusplus.com
template <class T> function; // undefined template <class Ret, class... Args> class function<Ret(Args...)>;
? 類模板說明
?????? std::function是一個(gè)函數(shù)包裝器模板,最早來自boost庫(kù),對(duì)應(yīng)其boost::function函數(shù)包裝器。在c++0x11中,將boost::function納入標(biāo)準(zhǔn)庫(kù)中。該函數(shù)包裝器模板能包裝任何類型的可調(diào)用元素(callable element),例如普通函數(shù)和函數(shù)對(duì)象。包裝器對(duì)象可以進(jìn)行拷貝,并且包裝器類型僅僅只依賴于其調(diào)用特征(call signature),而不依賴于可調(diào)用元素自身的類型。
?????? 一個(gè)std::function類型對(duì)象實(shí)例可以包裝下列這幾種可調(diào)用元素類型:函數(shù)、函數(shù)指針、類成員函數(shù)指針或任意類型的函數(shù)對(duì)象(例如定義了operator()操作并擁有函數(shù)閉包)。std::function對(duì)象可被拷貝和轉(zhuǎn)移,并且可以使用指定的調(diào)用特征來直接調(diào)用目標(biāo)元素。當(dāng)std::function對(duì)象未包裹任何實(shí)際的可調(diào)用元素,調(diào)用該std::function對(duì)象將拋出std::bad_function_call異常。
? 模板參數(shù)說明
?????? 以cplusplus.com中描述的原型說明:
???????T??????:?通用類型,但實(shí)際通用類型模板并沒有被定義,只有當(dāng)T的類型為形如Ret(Args...)的函數(shù)類型才能工作。
???????Ret???: 調(diào)用函數(shù)返回值的類型。
???????Args?: 函數(shù)參數(shù)類型。
std::function詳解
? 包裝普通函數(shù)
#include <iostream> #include <functional> using namespace std;int g_Minus(int i, int j) {return i - j; }int main() {function<int(int, int)> f = g_Minus;cout << f(1, 2) << endl; // -1return 1; }? 包裝模板函數(shù)
#include <iostream> #include <functional> using namespace std;template <class T> T g_Minus(T i, T j) {return i - j; }int main() {function<int(int, int)> f = g_Minus<int>;cout << f(1, 2) << endl; // -1return 1; }? 包裝lambda表達(dá)式
#include <iostream> #include <functional> using namespace std;auto g_Minus = [](int i, int j){ return i - j; };int main() {function<int(int, int)> f = g_Minus;cout << f(1, 2) << endl; // -1return 1; }? 包裝函數(shù)對(duì)象
?????? 非模板類型:
#include <iostream> #include <functional> using namespace std;struct Minus {int operator() (int i, int j){return i - j;} };int main() {function<int(int, int)> f = Minus();cout << f(1, 2) << endl; // -1return 1; }?????? 模板類型:
#include <iostream> #include <functional> using namespace std;template <class T> struct Minus { T operator() (T i, T j){return i - j;} };int main() {function<int(int, int)> f = Minus<int>();cout << f(1, 2) << endl; // -1return 1; }? 包裝類靜態(tài)成員函數(shù)
?????? 非模板類型:
#include <iostream> #include <functional> using namespace std;class Math { public:static int Minus(int i, int j){return i - j;} };int main() {function<int(int, int)> f = &Math::Minus;cout << f(1, 2) << endl; // -1return 1; }?????? 模板類型:
#include <iostream> #include <functional> using namespace std;class Math { public:template <class T>static T Minus(T i, T j){return i - j;} };int main() {function<int(int, int)> f = &Math::Minus<int>;cout << f(1, 2) << endl; // -1return 1; }? 包裝類對(duì)象成員函數(shù)
?????? 非模板類型:
#include <iostream> #include <functional> using namespace std;class Math { public:int Minus(int i, int j){return i - j;} };int main() {Math m;function<int(int, int)> f = bind(&Math::Minus, &m, placeholders::_1, placeholders::_2);cout << f(1, 2) << endl; // -1return 1; }?????? 模板類型:
#include <iostream> #include <functional> using namespace std;class Math { public:template <class T>T Minus(T i, T j){return i - j;} };int main() {Math m;function<int(int, int)> f = bind(&Math::Minus<int>, &m, placeholders::_1, placeholders::_2);cout << f(1, 2) << endl; // -1return 1; }總結(jié)
以上是生活随笔為你收集整理的std::cunction() 简单描述的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 林瑞c语言代码规范,林瑞庆
- 下一篇: STM32CubeMX5.6.1生成的代