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 ]
原文链接: https://www.cnblogs.com/wulingchao/p/13474118.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/201382
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!