C++11 学习笔记之std::function和bind绑定器

C++11 学习笔记之std::function和bind绑定器

概述

C++11引入了新的STL库,其中包含<functional>头文件,提供了一些与函数相关的新功能:std::functionstd::bind。这两个功能的使用可以使得C++中的函数更加灵活,便于使用。

  • std::function是一个通用的函数封装,可以存储、复制及调用任何可调用(可调 用是指函数、函数指针、函数对象、lambda表达式)的对象。
  • std::bind是一个通用的函数适配器,它能够把一个函数转变为一个可调用的对象。

std::function的使用

在使用std::function之前,需要#include<functional>头文件。

#include <iostream>
#include <functional>

int add(int a, int b)
{
    return a + b;
}

int main()
{
    std::function<int(int, int)> f = add;
    std::cout << f(1, 1) << std::endl;
}

上述代码展示了一个简单的示例,将add函数作为参数,创建了一个std::function对象f,并对其进行调用。可以看到,在调用f的时候,直接将参数传递给f即可,其余工作都已经被std::function对象简化掉。

#include <iostream>
#include <functional>

class Test 
{
public:
    int operator()(int a, int b)
    {
        return a * b;
    }
};

int main()
{
    Test t;
    std::function<int(int, int)> f = t;
    std::cout << f(2, 3) << std::endl;
}

上述代码展示了另一个示例,使用一个函数对象作为参数创建了一个std::function对象f,并对其进行调用。同样的,在调用f时,直接将参数传递给f,其余工作由std::function对象简化掉。

在使用std::function时,需要注意函数参数和返回值的类型及数量,必须与创建std::function对象时的参数和返回值类型相匹配。

std::bind的使用

std::bind函数可以把一个函数和一些参数包装成一个可调用对象,并返回这个对象。如果将它的返回值赋值给一个std::function对象,就可以像使用函数一样使用该函数对象。下面的示例演示了如何使用std::bind函数:

#include <iostream>
#include <functional>

int add(int a, int b)
{
    return a + b;
}

int main(void)
{
    auto f1 = std::bind(add, 1, 2);
    auto f2 = std::bind(add, std::placeholders::_1, std::placeholders::_2);
    std::cout << f1() << std::endl;
    std::cout << f2(3, 4) << std::endl;
    return 0;
}

上述代码中,std::bind函数将add函数和参数12std::placeholders::_1std::placeholders::_2打包成了可调用对象。第一个std::bindadd函数与参数12打包成了可调用对象f1,第二个std::bindadd函数和两个占位符(std::placeholders::_1std::placeholders::_2)打包成了可调用对象f2。在调用f1时,不需要传递参数,因为参数已经在std::bind函数的时候被绑定了;而在调用f2时,需要传递两个参数,它们分别对应着占位符std::placeholders::_1std::placeholders::_2

总结

std::functionstd::bind是C++11引入的两个重要功能,它们使得函数对象的创建和使用变得更加简单和灵活。在使用时,需要注意函数参数和返回值的类型和数量需与创建对象时的参数和返回值类型相匹配。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++11 学习笔记之std::function和bind绑定器 - Python技术站

(0)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • C语言实现的学生选课系统代码分享

    C语言实现的学生选课系统代码分享 简介 本文将分享一份用C语言实现的学生选课系统代码,该系统实现了学生的选课、退课、成绩查看等功能。通过学习本系统的代码,可以加深对C语法及数据结构的理解。 功能模块 学生选课系统包含了以下几个功能模块: 学生信息管理 课程信息管理 学生选课 学生退课 成绩查询 数据结构 该系统使用了以下数据结构: 结构体:用于存储学生信息、…

    C 2023年5月23日
    00
  • JavaScript中json对象和string对象之间相互转化

    JavaScript中json对象和string对象之间相互转化 在JavaScript中,我们经常需要将JSON对象和String对象相互转换。本文将详细讲解如何进行转换。 JSON对象转String对象 将JSON对象转换为String对象的方法是使用 JSON.stringify() 方法,它可以将一个JSON对象转换为一个格式化后的字符串。具体用法如…

    C 2023年5月23日
    00
  • jQuery访问json文件中数据的方法示例

    关于“jQuery访问json文件中数据的方法示例”的完整攻略,我提供如下说明。 标题 1. 创建json文件 首先要创建一个json文件,可以使用任何文本编辑器,比如sublime、notepad++等等。文件后缀名为.json 2. 读取json文件 读取json文件需要ajax方法。使用jQuery中的 $.getJSON() 方法,可用参数type、…

    C 2023年5月23日
    00
  • Mybatis-plus操作json字段实战教程

    下面是“Mybatis-plus操作json字段实战教程”的完整攻略: 1. 引入依赖 要操作json字段,我们需要引入fastjson依赖,以及mybatis-plus本身的依赖。在这里我们使用mybatis-plus的最新版本3.4.3: <dependency> <groupId>com.alibaba</groupId&…

    C 2023年5月23日
    00
  • C语言代码实现学生成绩管理系统

    C语言代码实现学生成绩管理系统的完整攻略 一、需求分析 学生成绩管理系统需要完成以下需求: 录入学生信息、成绩; 查询学生成绩; 修改学生成绩; 输出学生成绩列表; 统计学生成绩情况,如平均成绩、最高分、最低分等。 二、系统设计 学生信息和成绩的数据结构: struct student { char name[20]; // 姓名 int age; // 年…

    C 2023年5月23日
    00
  • 在Shell命令行处理JSON数据的方法

    在Shell命令行处理JSON数据的方法是非常常用的任务之一,下面是处理JSON数据的完整攻略: 1. 什么是JSON? JSON(JavaScript Object Notation)是一种常用的轻量级数据交换格式。可以理解为是一种数据结构,它由键值对构成,键和值之间使用:号连接。键值对中的项之间使用逗号分隔。大括号({})表示对象,中括号([])表示数组…

    C 2023年5月23日
    00
  • Matlab 2018a怎么安装?Matlab R2018a官方激活安装详细教程(附下载)

    下面我给您详细讲解“Matlab 2018a怎么安装?Matlab R2018a官方激活安装详细教程(附下载)”的完整攻略。 Matlab 2018a安装步骤: 首先,进入MathWorks官网,找到Matlab 2018a的下载页面,下载相应的安装程序 下载完成后,双击安装程序,出现安装窗口。选择“安装Matlab”,然后点击“下一步”。 阅读许可协议,并…

    C 2023年5月22日
    00
  • go语言异常panic和恢复recover用法实例

    下面是关于”Go语言异常panic和恢复recover用法实例”的详细攻略。 异常和panic 异常 异常是程序的非正常事件。当程序出现异常时,程序运行将被中断,控制流将进入一个异常处理程序来处理异常并防止程序崩溃。Go语言中的异常被称为panic。 panic 在Go语言中,panic函数被用于引发异常。当程序执行到panic()函数时,程序将会停止执行当…

    C 2023年5月22日
    00
合作推广
合作推广
分享本页
返回顶部