C++11新特性——std::function

系列文章目录

C++11新特性大全+实例


前言

C++ 这门编程语言的历史可以追溯至 1979 年,当时的 Bjarne Stroustrup(C++ 之父,后续简称 Stroustrup)还在使用 Simula 语言进行开发工作。

1998 年,C++ 标准委员会发布了第一版 C++ 标准,并将其命名为 C++ 98 标准。据不知名人士透露,《带注释的C++参考手册》这本书对 C++ 98 标准的制定产生了很大的影响。

经过作者的不断迭代,一本书往往会先后发布很多个版本,其中每个新版本都是对前一个版本的修正和更新。C++ 编程语言的发展也是如此。截止到目前(2020 年),C++ 的发展历经了以下 3 个个标准:

2011 年,新的 C++ 11 标准诞生,用于取代 C++ 98 标准。

2014 年,C++ 14 标准发布,该标准库对 C++ 11 标准库做了更优的修改和更新;

2017 年底,C++ 17 标准正式颁布;

虽然学习 C++11 需要花些时间,但这是非常值得的;C++11 非常实用,它不但提高了开发效率,还让程序更加健壮和优雅。程序员应该乐于升级换代已有的知识,而学习和使用 C++11 早就是大势所趋。

|版本声明:山河君,未经博主允许,禁止转载

一、std::function概述

1.定义

首先,跟进std::funtion并摘取部分源码查看

template <class _Fty>
class function : public _Get_function_impl<_Fty>::type { // wrapper for callable objects
private:
    using _Mybase = typename _Get_function_impl<_Fty>::type;

public:
    function() noexcept {}
...
}

可以很清楚的认知到这是一个类模板,C++提供了很多包装器例如C98的bind1st、bind2st,C++11的bind(具体可以bind详解那边博客)。

std::function是通用多态函数封装器,主要用作于存储、复制及调用任何可调用 (Callable) 目标。是不是看起来很复杂,其实可以把它理解为一种容器,存储可调用对象。

2.可调用对象

存储的类型以下几种:
(1)普通函数
(2)函数指针
(3)lambda 表达式
(4)bind 创建的对象
(5)仿函数

这里附加一句:
有很多博文中说std::function是函数的容器其实是不准确的,如果它只能用于存储函数、或是lambda表达式还可以这么说。因为bind绑定对象以及仿函数,看起来像是函数指针,而实际上是可调用对象,并不能单单的也看做函数。

二、使用实例

void fun1(std::string str)// 普通函数
{
    std::cout << str << std::endl;
}

auto fun2 = [](std::string str) -> void { std::cout << str << std::endl; };// Lambda表达式

class Test1
{
public:
    void operator()(std::string str) { std::cout << str << std::endl; }// 仿函数(functor)
};

class Test2
{
public:
    void fun3(std::string str) { std::cout << str << std::endl; } //类成员函数
    static void fun4(std::string str) { std::cout << str << std::endl; }//类静态函数
};

int main()
{
    std::function<void(std::string)> Functional;

    // 普通函数。
    Functional = fun1;
    Functional("普通函数");

    // Lambda表达式。
    Functional = fun2;
    Functional("Lambda 表达式");

    // 仿函数。
    Test1 test1;
    Functional = test1;
    Functional("仿函数");

    // 类成员函数。
    Test2 test2;
    Functional = std::bind(&Test2::fun3, test2, std::placeholders::_1);
    Functional("类成员函数");

    // 类静态函数。
    Functional = Test2::fun4;
    Functional("类静态函数");

    return 0;
}

总结

仍在持续更新中~
如果对您有所帮助,请点个赞!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值