#include <functional>
#include <iostream>
/*
这是c++11新添加的,使用时需要引入头文件#include <functional>
std::function类模板是一个通用的多态函数封装器。 std::function对象可以存储、拷贝、调用任何可以调用的对象函数、lambda表达式、绑定表达式、函数对象,以及指向成员函数和数据成员的指针。
被存储的、可调用的对象,被叫做std::function target。如果一个std::function没有包含target,则称其为空std::function,强行调用其target会导致bad_function_call的异常抛出。
因为std::function是一种类模板,所以要传入类型,就如std::vector<int> 传入类型int一样;不过,std::function传入的是”函数返回类型 (参数类型列表)", 如:std::function<void(int)>
*/
void globalFunc()
{
std::cout << "globalFunc" << std::endl;
}
//传入函数指针
void saveGlobalFuncAndCall(){
std::function<void()> f = globalFunc;//std::function<void()> f(globalFunc)
f();
}
template <class T>
T g_Add(T i, T j)
{
std::cout << i + j << std::endl;
return i + j;
}
//传入模板函数指针
void saveTemplateFuncAndCall(){
std::function<int(int,int)> f(g_Add<int>);//std::function<int(int,int)> f = g_Add<int>;
f(6,3);
}
//传入Lambda Express(匿名类对象)
void saveLambdaExpressAndCall(){
/*
auto g_Lambda = [](int i, int j){
return i + j;
};
std::function<int(int, int)> func(g_Lambda);//std::function<int(int, int)> func = g_Lambda;
std::cout << func(5, 8) << std::endl;
*/
/*
std::function<int(int, int)> func = [](int i, int j){
return i + j;
};
std::cout << func(5, 8) << std::endl;
*/
std::function<int(int, int)> func([](int i, int j){
return i + j;
});
std::cout << func(5, 8) << std::endl;
}
//函数对象
struct Add
{
int operator()(int i, int j)
{
return i + j;
}
};
//模板函数对象
template <class T>
struct AddT
{
T operator()(T i, T j)
{
return i + j;
}
};
//传入函数对象
void saveFunctionInstance(){
std::function<int(int, int)> f = Add();
std::cout<<f(2,3)<<std::endl;
std::function<int(int, int)> ft = AddT<int>();
std::cout << ft(5, 6)<<std::endl;
}
class Computer
{
public:
static int Add(int i, int j)
{
return i + j;
}
template<class T>
static T AddT(T i, T j)
{
return i + j;
}
int AddN(int i, int j)
{
return i + j;
}
};
//存储类函数、类模板函数、实例对象成员函数并调用
void saveClassFunctionClassTemplateFunctionInstanceMemFunction(){
//1、类函数
std::function<int(int, int)> f = &Computer::Add;
std::cout << f(1, 1) << std::endl;
//2、类模板函数
std::function<int(int, int)> ft = &Computer::AddT<int>;
std::cout << ft(2, 3) << std::endl;
//实例对象成员函数绑定 需要构造类对象
Computer c;
//3、实例对象成员函数,需使用bind,将类对象地址&c绑定上
std::function<int(int, int)> fN = std::bind(&Computer::AddN, &c, std::placeholders::_1, std::placeholders::_2);
std::cout << fN(1, 1) << std::endl;
}
int main(int argc, char** agrv)
{
saveClassFunctionClassTemplateFunctionInstanceMemFunction();
return 0;
}