轉自:
https://www.cnblogs.com/heartchord/p/5017071.html
////////////////////
std::function
參考資料
• 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; // -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;
}

