std::function 的使用說明

轉自:html

https://www.cnblogs.com/heartchord/p/5017071.htmlios

////////////////////c++

std::function

 

參考資料


• cplusplus.comhttp://www.cplusplus.com/reference/functional/function/閉包

• cppreference.comhttp://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;
}
複製代碼
相關文章
相關標籤/搜索