C++11中的std::function

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);

  1. std::function

    std::function 是一个可调用对象包装器,是一个类模板,可以容纳除了类成员函数指针之外的所有可调用对象,它可以用统一的方式处理函数、函数对象、函数指针,并允许保存和延迟它们的执行。
    定义格式:std::function<函数类型>。
    std::function可以取代函数指针的作用,因为它可以延迟函数的执行,特别适合作为回调函数使用。它比普通函数指针更加的灵活和便利。

  2. std::bind

可将std::bind函数看作一个通用的函数适配器,它接受一个可调用对象,生成一个新的可调用对象来“适应”原对象的参数列表。

std::bind将可调用对象与其参数一起进行绑定,绑定后的结果可以使用std::function保存。std::bind主要有以下两个作用:

将可调用对象和其参数绑定成一个仿函数;
只绑定部分参数,减少可调用对象传入的参数。

链接:https://www.jianshu.com/p/f191e88dcc80

  1. std::ref
    std::ref 用于包装按引用传递的值。
    std::cref 用于包装按const引用传递的值。
    bool requestTermination = false;
    std::function<int()> threadFunction = std::bind(
    &TestClass::ClassMember, testObj, std::ref(requestTermination));

  2. 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();
    }

  3. 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;

  1. 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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值