1. 程式人生 > 其它 >C++11 function類模板

C++11 function類模板

技術標籤:C++學習

C++11 function類模板

1. std::function 簡介

類模板std :: function是一個通用的多型函式包裝器。 std :: function的例項可以儲存,複製和呼叫任何可呼叫的目標 :包括函式,lambda表示式,繫結表示式或其他函式物件,以及指向成員函式和指向資料成員的指標。當std::function物件未包裹任何實際的可呼叫元素,呼叫該std::function物件將丟擲std::bad_function_call異常。

2. function類模板

  template< class R, class... Args >
class function<R(Args...)>;

模板引數說明:
R: 被呼叫函式的返回型別
Args…:被呼叫函式的形參
例如:function<int(int,int)> func;
則 function類的例項func可以指向 返回值為int型,有兩個形參都為int型的函式。

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

結果:
在這裡插入圖片描述

3. function的成員函式

成員函式宣告 說明
constructor 建構函式:constructs a new std::function instance
destructor 解構函式: destroys a std::function instance
operator= 給定義的function物件賦值
operator bool 檢查定義的function物件是否包含一個有效的物件
operator() 呼叫一個物件

4. std::function用法詳解

4.1 呼叫普通函式

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

4.2 呼叫函式物件

#include <functional>
#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;
   std::cout<<func(1,2)<<std::endl;    //3
   return 0;
}

4.3 呼叫模板函式物件

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

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

4.4 呼叫類靜態成員函式

#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;
}

4.5 呼叫類成員函式

#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;
}

4.6 呼叫類公有資料成員

#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); //error: ‘Plus::Plus(int)’ is private within this context
    function<int(const Plus&)> f = &Plus::num;
  //function<int(const Plus)> f = &Plus::num;
    cout << f(p) << endl;     //2
    system("pause");                                       
    return 0;
}

4.7 通過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