c++std::funciona代替函数指针——结合std::bind-创新互联
一、介绍std::function
网站题目:c++std::funciona代替函数指针——结合std::bind-创新互联
URL网址:http://azwzsj.com/article/dsssej.html
std::function是函数模板类(是一个类)。包含在#include
typedef void(*ptr)(int,int)// 这里的ptr就是一个函数指针
而使用了std::function这个类的时候,我们可以这样使用,来替换函数指针。例如
std::functionfunc;
std::function 是一种通用、多态的函数封装。它的实例能存储、复制及调用任何可调用 (Callable) 目标——函数、 lambda 表达式、 bind 表达式或其他函数对象,还有指向成员函数指针和指向数据成员指针。
它也是对 C++ 中现有的可调用实体的一种类型安全的包裹(相对来说,函数指针的调用不是类型安全的)
二、与std::bind结合可以将std::bind函数看作一个通用的函数适配器,它接受一个可调用对象,生成一个新的可调用对象来“适应”原对象的参数列表。
std::bind将可调用对象与其参数一起进行绑定,绑定后的结果可以使用std::function保存。std::bind主要有以下两个作用:
- 将可调用对象和其参数绑定成一个仿函数;
- 只绑定部分参数,减少可调用对象传入的参数。
1、std::bind绑定普通函数
double my_divide(double x, double y) { return x / y; };
int main(int argc, char* argv[])
{
auto fn_half = std::bind(my_divide, std::placeholders::_1, 2);
std::cout<< fn_half(10)<< '\n'; // 输出为5
return 0;
}
2、std::bind绑定一个成员函数
struct Foo {
void print_sum(int n1, int n2)
{
std::cout<< n1+n2<< '\n';
}
int data = 10;
};
int main()
{
Foo foo;
auto f = std::bind(&Foo::print_sum, &foo, 95, std::placeholders::_1);
f(5); // 100
}
三、实例#include#include#include#include
运行后控制台打印如下
四、总结简而言之,std::function 就是函数的容器。比传统的函数指针功能更强大,配合上bind能够解决成员函数指针跟随类的弊端
弊端可参考如下:
【C++】std::function与函数指针_芒果黑的博客-博客_c++ function 转函数指针
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
网站题目:c++std::funciona代替函数指针——结合std::bind-创新互联
URL网址:http://azwzsj.com/article/dsssej.html