std::cunction() 简单描述
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這三種都可以使用同一種調用形式,int(int, int),調用方式如下:
[cpp] view plain copy學會了使用function,可以繼續如下進行抽象定義,不同類型采用相同的調用方法: [cpp] view plain copy
以上就是function的簡單使用。下面是從另一篇博客轉載的,使用function的引用來保存函數對象。考慮下面代碼: [cpp] view plain copy
上面的輸出結果是 10 10 0。我們將同一個函數對象賦值給了兩個function,然后分別調用這兩個function,但函數中的成員變量的值沒有保存,問題在哪里?因為function的缺省行為是拷貝一份傳遞給它的函數對象,于是f1,f2中保存的都是cAdd對象的拷貝。
C++11提供了ref和cref函數來提供對象的引用和常引用的包裝。要是function能夠正確保存函數對象的狀態,可以如下修改代碼:
[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簡介
? 類模板聲明
// 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是一個函數包裝器模板,最早來自boost庫,對應其boost::function函數包裝器。在c++0x11中,將boost::function納入標準庫中。該函數包裝器模板能包裝任何類型的可調用元素(callable element),例如普通函數和函數對象。包裝器對象可以進行拷貝,并且包裝器類型僅僅只依賴于其調用特征(call signature),而不依賴于可調用元素自身的類型。
?????? 一個std::function類型對象實例可以包裝下列這幾種可調用元素類型:函數、函數指針、類成員函數指針或任意類型的函數對象(例如定義了operator()操作并擁有函數閉包)。std::function對象可被拷貝和轉移,并且可以使用指定的調用特征來直接調用目標元素。當std::function對象未包裹任何實際的可調用元素,調用該std::function對象將拋出std::bad_function_call異常。
? 模板參數說明
?????? 以cplusplus.com中描述的原型說明:
???????T??????:?通用類型,但實際通用類型模板并沒有被定義,只有當T的類型為形如Ret(Args...)的函數類型才能工作。
???????Ret???: 調用函數返回值的類型。
???????Args?: 函數參數類型。
std::function詳解
? 包裝普通函數
#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; }? 包裝模板函數
#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表達式
#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; }? 包裝函數對象
?????? 非模板類型:
#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; }? 包裝類靜態成員函數
?????? 非模板類型:
#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; }? 包裝類對象成員函數
?????? 非模板類型:
#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; }總結
以上是生活随笔為你收集整理的std::cunction() 简单描述的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 林瑞c语言代码规范,林瑞庆
- 下一篇: STM32CubeMX5.6.1生成的代