c++11知识点4_std的function的用法
来源:互联网 发布:亚马逊云 centos root 编辑:程序博客网 时间:2024/05/22 20:29
1.概述
1.1.定义
类模版std::function是一种通用、多态的函数封装。
std::function的实例可以对任何可以调用的目标实体进行存储、复制、和调用操作,这些目标实体包括普通函数、Lambda表达式、
函数指针、以及其它函数对象等。
std::function对象是对C++中现有的可调用实体的一种类型安全的包裹(我们知道像函数指针这类可调用实体,是类型不安全的)。
最简单的理解就是:
通过std::function对C++中各种可调用实体(普通函数、Lambda表达式、函数指针、以及其它函数对象等)的封装,形成一个新
的可调用的std::function对象;让我们不再纠结那么多的可调用实体。一切变的简单粗暴。
1.2.可调用实体转换为std::function对象需要遵守以下两条原则:
(1)转换后的std::function对象的参数能转换为可调用实体的参数;
(2)可调用实体的返回值能转换为std::function对象的返回值。
1.3.用处
std::function对象最大的用处就是在实现函数回调,使用者需要注意,它不能被用来检查相等或者不相等,但是可以与NULL或者
nullptr进行比较。
1.4.好处
std::function实现了一套类型消除机制,可以统一处理不同的函数对象类型。
以前我们使用函数指针来完成这些;现在我们可以使用更安全的std::function来完成这些任务。
2.实例
//各个可调用实体转换成std::function类型的对象
#include <functional>
#include <iostream>
using namespace std;
std::function< int(int)> Functional;
// 普通函数
int TestFunc(int a)
{
return a;
}
// Lambda表达式
auto lambda = [](int a)->int{ return a; };
// 仿函数(functor)
class Functor
{
public:
int operator()(int a)
{
return a;
}
};
// 1.类成员函数
// 2.类静态函数
class TestClass
{
public:
int ClassMember(int a) { return a; }
static int StaticMember(int a) { return a; }
};
int main()
{
// 普通函数
Functional = TestFunc;
int result = Functional(10);
cout << "普通函数:"<< result << endl;
// Lambda表达式
Functional = lambda;
result = Functional(20);
cout << "Lambda表达式:"<< result << endl;
// 仿函数
Functor testFunctor;
Functional = testFunctor;
result = Functional(30);
cout << "仿函数:"<< result << endl;
// 类成员函数
TestClass testObj;
Functional = std::bind(&TestClass::ClassMember, testObj, std::placeholders::_1);
result = Functional(40);
cout << "类成员函数:"<< result << endl;
// 类静态函数
Functional = TestClass::StaticMember;
result = Functional(50);
cout << "类静态函数:"<< result << endl;
return 0;
}
1.1.定义
类模版std::function是一种通用、多态的函数封装。
std::function的实例可以对任何可以调用的目标实体进行存储、复制、和调用操作,这些目标实体包括普通函数、Lambda表达式、
函数指针、以及其它函数对象等。
std::function对象是对C++中现有的可调用实体的一种类型安全的包裹(我们知道像函数指针这类可调用实体,是类型不安全的)。
最简单的理解就是:
通过std::function对C++中各种可调用实体(普通函数、Lambda表达式、函数指针、以及其它函数对象等)的封装,形成一个新
的可调用的std::function对象;让我们不再纠结那么多的可调用实体。一切变的简单粗暴。
1.2.可调用实体转换为std::function对象需要遵守以下两条原则:
(1)转换后的std::function对象的参数能转换为可调用实体的参数;
(2)可调用实体的返回值能转换为std::function对象的返回值。
1.3.用处
std::function对象最大的用处就是在实现函数回调,使用者需要注意,它不能被用来检查相等或者不相等,但是可以与NULL或者
nullptr进行比较。
1.4.好处
std::function实现了一套类型消除机制,可以统一处理不同的函数对象类型。
以前我们使用函数指针来完成这些;现在我们可以使用更安全的std::function来完成这些任务。
2.实例
//各个可调用实体转换成std::function类型的对象
#include <functional>
#include <iostream>
using namespace std;
std::function< int(int)> Functional;
// 普通函数
int TestFunc(int a)
{
return a;
}
// Lambda表达式
auto lambda = [](int a)->int{ return a; };
// 仿函数(functor)
class Functor
{
public:
int operator()(int a)
{
return a;
}
};
// 1.类成员函数
// 2.类静态函数
class TestClass
{
public:
int ClassMember(int a) { return a; }
static int StaticMember(int a) { return a; }
};
int main()
{
// 普通函数
Functional = TestFunc;
int result = Functional(10);
cout << "普通函数:"<< result << endl;
// Lambda表达式
Functional = lambda;
result = Functional(20);
cout << "Lambda表达式:"<< result << endl;
// 仿函数
Functor testFunctor;
Functional = testFunctor;
result = Functional(30);
cout << "仿函数:"<< result << endl;
// 类成员函数
TestClass testObj;
Functional = std::bind(&TestClass::ClassMember, testObj, std::placeholders::_1);
result = Functional(40);
cout << "类成员函数:"<< result << endl;
// 类静态函数
Functional = TestClass::StaticMember;
result = Functional(50);
cout << "类静态函数:"<< result << endl;
return 0;
}
0 0
- c++11知识点4_std的function的用法
- C++_std::bind std::function 高级用法
- Function.call()的用法
- lambda function的用法
- boost function的用法
- function的用法
- (function ($){})(jQuery)的用法。
- boost::function的用法
- boost::function的用法
- std::function的用法
- MATLAB中的S-Function的用法(C语言)
- matlab 中的 S-Function的用法(C语言)
- MATLAB中的S-Function的用法(C语言)
- MATLAB中的S-Function的用法(C语言)
- Simulink 中S-function 包含C文件的用法
- 某些FUNCTION用法的复习!!!
- boost::function的简单用法
- Matlab中function的用法!
- python3标准库
- c++11知识点3_chrono时间模板库
- java异常处理和设计
- PostgreSQL总结(1) - 数据库简介及安装
- 【C++简单写Word】(三) 基本操作的实现
- c++11知识点4_std的function的用法
- Java入门到精通---工具篇之Maven概述
- PHP CURL 使用代理访问服务器
- 大家都是程序员,当人家给你尊重,请回馈以尊重
- Maven3路程(三)用Maven创建第一个web项目(1)
- Java String类源码分析
- Android ListView和RecyclerView常见问题
- 用户标签系统 数据库设计
- 适配——Drawable适配