C++11 function類模板
阿新 • • 發佈:2021-01-06
技術標籤: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