https://www.cnblogs.com/diegodu/p/6180350.html
最简单的理解就是:
通过std::function对C++中各种可调用实体(普通函数、Lambda表达式、函数指针、以及其它函数对象等)的封装,形成一个新的可调用的std::function对象;让我们不再纠结那么多的可调用实体。一切变的简单粗暴。
// 类成员函数
std::function< int(int)> Functional;
TestClass testObj;
Functional = std::bind(&TestClass::ClassMember, testObj, std::placeholders::_1);
result = Functional(false);
-
std::function
std::function 是一个可调用对象包装器,是一个类模板,可以容纳除了类成员函数指针之外的所有可调用对象,它可以用统一的方式处理函数、函数对象、函数指针,并允许保存和延迟它们的执行。
定义格式:std::function<函数类型>。
std::function可以取代函数指针的作用,因为它可以延迟函数的执行,特别适合作为回调函数使用。它比普通函数指针更加的灵活和便利。 -
std::bind
可将std::bind函数看作一个通用的函数适配器,它接受一个可调用对象,生成一个新的可调用对象来“适应”原对象的参数列表。
std::bind将可调用对象与其参数一起进行绑定,绑定后的结果可以使用std::function保存。std::bind主要有以下两个作用:
将可调用对象和其参数绑定成一个仿函数;
只绑定部分参数,减少可调用对象传入的参数。
链接:https://www.jianshu.com/p/f191e88dcc80
-
std::ref
std::ref 用于包装按引用传递的值。
std::cref 用于包装按const引用传递的值。
bool requestTermination = false;
std::function<int()> threadFunction = std::bind(
&TestClass::ClassMember, testObj, std::ref(requestTermination)); -
std::async
std::future threadResult = std::async(std::launch::async, threadFunction);
auto status = threadResult.wait_for(std::chrono::milliseconds(millisecondsToWait));
if(status == std::future_status::timeout)
{
requestTermination = true;
return -threadResult.get();
} -
Lambda表达式
auto lambda = [](int a)->int{ return a*5; };
ISO C++ 11 标准的一大亮点是引入Lambda表达式。基本语法如下:
[capture list] (parameter list) ->return type { function body }
简单的讲一下各个部分的作用
[capture list]捕获列表,捕获到函数体中,使得函数体可以访问
(parameter list)参数列表,用来表示lambda表达式的参数列表
->return type函数返回值 {function body}就是函数体
auto f=[x](int a,int b){return a>x;};//x被捕获复制
int x=0, y=1;
auto g=[&](int x){return ++y;};//y被捕获引用,调用g后会修改y,需要注意y的生存期
bool(*fp)(int, int)=[](int a,int b){return a>b;};//不捕获时才可转换为函数指针
c#:
Func<int,int> lambda = a => a*5;
- C++11新特性std::make_tuple的使用
https://www.jb51.net/article/196972.htm
std::tuple是C++ 11中引入的一个非常有用的结构,以前我们要返回一个包含不同数据类型的返回值,一般都需要自定义一个结构体或者通过函数的参数来返回,现在std::tuple就可以帮我们搞定。
6.1.引用头文件
#include
6.2. Tuple初始化
std::tuple的初始化可以通过构造函数实现。
// Creating and Initializing a tuple
std::tuple<int, double, std::string> result1 { 22, 19.28, “text” };
这种初始化方式要定义各个元素的数据类型,比较繁琐,C++11也提供了另外一种方式std::make_tuple。
6.3. std::make_tuple
// Creating a tuple using std::make_tuple
auto result2 = std::make_tuple( 7, 9.8, “text” );
这种初始化方式避免需要逐个指定元素类型的问题,自动化实现各个元素类型的推导。
6.4 std::tie:创建左值引用的 tuple,或将 tuple 解包为独立对象
int myint;
double myDouble;
std::tie (myint, myDouble, std::ignore) = result2 ;
std::cout << "myint contains: " << myint << ‘\n’;
std::cout << "mydouble contains: " << myDouble<< ‘\n’;
myint contains: 7
mydouble contains: 9.8