C++11 function類模板


1、 std::function

類模板 std::function 是一個通用的多態函數包裝器。當做函數指針。

2、function類模板

1 template< class R, class... Args >
2 class function< R (Args...)>

說明:R是被調用函數的返回類型   Args....是被調用的函數的形參。

function是類模板,只有成員函數,沒有數據成員。

3、用法

3.1 調用普通函數

#include <functional>
#include <iostream>
int f(int a, int b)
{
  return a+b;
}
int main()
{
    std::function<int(int, int)>func = f;
    cout<<func(1, 2)<<endl;      // 3
    system("pause");
    return 0;
}

說明:模板類必須實例化使用,上面實例化后對象名 func,對象func可以指向的函數是有兩個int參數,返回值是int的函數,函數f滿足。調用也只需func( 1,2 )實現調用。

3.2 調用函數對象

#include<iostream>
using namespace std;

//function object
struct functor
{
public:
    int operator() (int a, int b)
    {
        return a + b;
    }
};
int main()
{
   functor ft;
   function<int(int,int)> func = ft();
   cout<<func(1,2)<<endl;    //3
   return 0;
}

3.3 調用模板函數對象

#include<iostream>
using namespace std;

//function object
template<class T>
struct functor
{
public:
    T operator() (T a, T b)
    {
        return a + b;
    }
};
int main()
{
   functor ft;
   function<int(int,int)> func = ft<int>();
   cout<<func(1,2)<<endl;    //3
   return 0;
}

3.4 調用lambda表達式

#include <functional>
#include <iostream>
using namespace std;
int main()
{
    auto f = [](const int a, const int b) {return a + b; };
    std::function<int(int, int)>func = f;
    cout << func(1, 2) << endl;      // 3
    system("pause");
    return 0;
}

3.5 調用類靜態成員函數

#include <iostream>
#include <functional>
using namespace std;

class Plus
{
public:
    static int plus(int a, int b)
    {
        return a + b;
    }
};

int main()
{
    function<int(int, int)> f = &Plus::plus;
    cout << f(1, 2) << endl;     //3
    system("pause");                                       
    return 0;
}

 

3.6 調用類成員函數

#include <iostream>
#include <functional>
using namespace std;

class Plus
{
public:
    int plus(int a, int b)
    {
        return a + b;
    }
};

int main()
{
    Plus p;
    function<int(Plus&,int, int)> f = &Plus::plus;
  //function<int(const Plus,int, int)> f = &Plus::plus;
    cout << f(p,1, 2) << endl;     //3
    system("pause");                                       
    return 0;
}

 

3.7 調用類公有數據成員

#include <iostream>
#include <functional>
using namespace std;

class Plus
{
    Plus(int num_):num(num_){}
    public:
        int plus(int a, int b)
        {
            return a + b;
        }
       int  num;
};

int main()
{
    const Plus p(2);
    function<int(const Plus&)> f = &Plus::num;
  //function<int(const Plus)> f = &Plus::num;
    cout << f(p) << endl;     //2
    system("pause");                                       
    return 0;
}

 

3.8 通過bind函數調用類成員函數

#include <iostream>
#include <functional>
using namespace std;

class Plus
{
public:
    int plus(int a, int b)
    {
        return a + b;
    }
};

int main()
{
   Plus p;
   // 指針形式調用成員函數
   function<int(int, int)> f = bind(&Plus::plus, &p, placeholders::_1, placeholders::_2);// placeholders::_1是占位符
   // 對象形式調用成員函數
   function<int(int, int)> f1 = bind(&Plus::plus, p, placeholders::_1, placeholders::_2);// placeholders::_1是占位符
   cout << f(1, 2) << endl;     //3
   cout << f1(1, 2) << endl;     //3
   system("pause");                                       
   return 0;
}

 參考:

博客 [ https://blog.csdn.net/qq_35721743/article/details/83217416?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.edu_weight&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.edu_weight ]


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM