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日

相关文章

  • 教你如何使用PHP输出中文JSON字符串

    下面是“教你如何使用PHP输出中文JSON字符串”的完整攻略: 1. 什么是JSON 在开始讲解如何使用PHP输出中文JSON字符串之前,我们需要先理解JSON是什么。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,大部分现代编程语言都支持解析和生成JSON数据。它基于JavaScript语言的子集,并且易于阅读和…

    C 2023年5月23日
    00
  • C++代码实现贪吃蛇小游戏

    C++代码实现贪吃蛇小游戏的完整攻略 介绍 贪吃蛇是一种经典的游戏,也是C++学习过程中的一个很好的项目。本文将介绍如何使用C++实现一个简单的贪吃蛇小游戏。 前置知识 本文需要读者具备C++的基础知识,以及对标准库函数和数据结构的理解。 程序设计思路 贪吃蛇游戏的设计思路如下: 绘制游戏界面:使用控制台绘制游戏界面,包括蛇、食物和地图等。 控制蛇的移动:根…

    C 2023年5月23日
    00
  • Shell在日常工作中的应用实践

    作者:京东物流 李光新 1 Shell可以帮我们做什么 作为一名测试开发工程师,在与linux服务器交互过程中,大都遇到过以下这些问题: •一次申请多台服务器,多台服务器需要安装相同软件,配置相同的环境,同样的操作需要重复多次; •工作中经常会使用命令行命令来完成我们的一些操作,但是有些命令使用率很高,而且很长,每次都全部敲进去势必会浪费很多时间(比如查日志…

    C语言 2023年4月22日
    00
  • 移动m812c手机怎么样? 中国移动m812c参数配置详情介绍

    移动M812C手机怎么样? 移动M812C手机是中国移动推出的一款价格亲民的智能手机,旨在提供基本的移动通信和基础应用功能。下面将详细介绍它的参数配置和使用情况。 1. 参数配置 移动M812C手机参数如下: 屏幕:5.45 英寸屏幕,分辨率为 480 x 960 像素 处理器:联发科 MT6739WA 四核处理器 存储空间:2GB RAM + 16GB R…

    C 2023年5月23日
    00
  • C语言中如何实现桶排序

    C语言中实现桶排序,其主要思想是将待排序的序列分解成若干个区间,对于每个区间分别使用一个桶来存放该区间内的元素,然后对每个桶中的元素进行排序,最后按照桶的顺序将所有元素连接起来,就得到了排好序的序列。 具体的实现步骤如下: 1.确定桶的数量和区间范围。根据序列中的元素取值范围,确定桶的数量并计算区间大小。 2.将元素分配到对应的桶中。遍历待排序的序列,将每个…

    C 2023年5月22日
    00
  • C++ 数据结构之水洼的数量算法

    C++ 数据结构之水洼的数量算法 问题描述 有一个矩阵区域,其中包含了若干个“水洼”,每个水洼是由相邻的“水滴”组成的区域。其中,相邻的“水滴”指的是上下左右四个方向上位置相邻的“.”,而不是斜对角线方向。 例如,下面的矩阵区域中,连续的“.”就构成了两个水洼: X . . X . X . . X . . X X . . . . . X . 现在,给定一个这…

    C 2023年5月22日
    00
  • C语言实现扫雷代码

    下面是“C语言实现扫雷代码”的完整攻略: 1. 设计数据结构 在扫雷游戏中,我们需要用到以下数据结构: 1.1 格子(Cell) 每一个格子有一个横坐标、一个纵坐标,以及一个当前状态(未打开、已标记、已揭开)和一个值(0 – 8代表周围8个格子中地雷的数量,9代表该格子本身就是地雷)。 struct Cell { int x; // 横坐标 int y; /…

    C 2023年5月23日
    00
  • 搭建C语言开发环境(Windows平台)汇总

    搭建C语言开发环境(Windows平台)汇总 简介 本文将介绍如何在Windows平台下搭建C语言开发环境,包括: 安装C语言编译器 安装集成开发环境 配置环境变量 编写并编译第一个C程序 步骤 1. 安装C语言编译器 推荐使用免费的开源GCC编译器,官方网站为 http://gcc.gnu.org/ 。可以前往该网站下载最新版本的GCC编译器安装包,然后按…

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