參考資料
• 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),而不依賴於可調用元素自身的類型。post
一個std::function類型對象實例能夠包裝下列這幾種可調用元素類型:函數、函數指針、類成員函數指針或任意類型的函數對象(例如定義了operator()操做並擁有函數閉包)。std::function對象可被拷貝和轉移,而且可使用指定的調用特徵來直接調用目標元素。當std::function對象未包裹任何實際的可調用元素,調用該std::function對象將拋出std::bad_function_call異常。spa
• 模板參數說明
以cplusplus.com中描述的原型說明:指針
T : 通用類型,但實際通用類型模板並無被定義,只有當T的類型爲形如Ret(Args...)的函數類型才能工做。code
Ret : 調用函數返回值的類型。htm
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; // -1 return 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; // -1 return 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; // -1 return 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; // -1 return 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; // -1 return 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; // -1 return 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; // -1 return 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; // -1 return 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; // -1 return 1; }