c++ 新特性 std::bind 简单实验

1.概要

std::bind 是 C++11 引入的一个功能,它用于绑定函数/可调用对象到特定的参数,并生成一个新的可调用对象。这个新的可调用对象可以稍后调用,就像调用原始函数/可调用对象一样,但会带有预先绑定的参数。

std::placeholders::_1、std::placeholders::_2 等是 C++11 引入的占位符,用于 std::bind 表达式中,以指示哪些参数将在稍后调用绑定后的函数对象时被提供。这些占位符用于替换被绑定的函数或可调用对象的某些参数。
在 std::bind 的上下文中,std::placeholders::_1 表示第一个(从 1 开始计数)没有被显式绑定的参数,std::placeholders::_2 表示第二个,以此类推。当绑定后的函数对象被调用时,你需要为这些占位符提供具体的值。

2.代码分析

2.1std::bind 简单实验
2.1.1 代码
#include <iostream>  
#include <functional> // 包含 std::bind 的头文件  
using namespace std;

namespace t1 {
    // 一个简单的函数,接受两个整数参数并返回它们的和  
    int add(int a, int b) {
        return a + b;
    }
    void test() {
        cout << "----------------------------------------------\n";
        // 你也可以绑定多个参数  
        auto bound_add_ten_fifteen = std::bind(add, 10, 15);
        int another_result = bound_add_ten_fifteen(); // 这相当于调用 add(10, 15)  
        std::cout << "Another Result: " << another_result << std::endl; // 输出: Another Result: 25  
    }
}
2.1.2 实验结果
Another Result: 25 == 10(占位)+15(占位)

在这个例子中,我们首先定义了一个简单的 add 函数,它接受两个整数参数并返回它们的和。然后,我们使用 std::bind 来绑定 aadd 函数的两个参数,生成一个不接受任何参数的可调用对象 bound_add_ten_fifteen。这个可调用对象直接返回 add(10, 15) 的结果。

注意,在绑定参数时,我们使用 std::placeholders::_1、std::placeholders::_2 等来表示原始函数/可调用对象的参数。这些占位符在 std::bind 的参数列表中按照它们在原始函数/可调用对象中的顺序来替代实际的参数。

2.2 std::placeholders::_1 等占位符实验
2.2.1 代码
/// <summary>
/// std::placeholders::_1 是 C++11 引入的占位符,用于 std::bind 表达式中,
/// 以指示哪些参数将在稍后调用绑定后的函数对象时被提供。
/// 这些占位符用于替换被绑定的函数或可调用对象的某些参数。
/// </summary>
namespace t2 {
    // 一个简单的函数,接受两个整数参数并返回它们的和  
    int add(int a, int b) {
        return a + b;
    }
    void test() {
        cout << "----------------------------------------------\n";
        // 使用 std::bind 绑定 add 函数的第一个参数为 5  
        // std::placeholders::_1 表示一个占位符
        auto bound_add_five = std::bind(add, 5, std::placeholders::_1);

        // 现在 bound_add_five 是一个新的可调用对象,它接受一个整数参数  
        // 并返回该整数与 5 的和  
        int result = bound_add_five(3); // 这相当于调用 add(5, 3)  
        std::cout << "Result: " << result << std::endl; // 输出: Result: 8  

    }
}
2.2.3 实验结果
Result: 8 = 5(占位)+3

2.3 尝试多个占位符
2.3.1 代码
namespace t3 {
    // 一个简单的函数,接受两个整数参数并返回它们的和  
    int add(int a, int b,int c) {
        return a + b+c;
    }
    void test() {
        cout << "----------------------------------------------\n";
        // 使用 std::bind 绑定 add 函数的第一个参数为 5 
        // std::placeholders::_0 表示一个占位符 类似于数据的[0] 
        // std::placeholders::_1 表示一个占位符 类似于数据的[1]
        // std::placeholders::_2 表示一个占位符 类似于数据的[2]
        auto bound_add_five = std::bind(add, 5, std::placeholders::_1, std::placeholders::_2);

        // 现在 bound_add_five 是一个新的可调用对象,它接受一个整数参数  
        // 并返回该整数与 5 的和  
        int result = bound_add_five(3,4); // 这相当于调用 add(5, 3)  
        std::cout << "Result: " << result << std::endl; // 输出: Result: 8  
    }
}
2.3.2 运行结果
Result: 12  = 5(占位)+3+4(占位)

2.4 尝试交叉绑定参数
//尝试交叉绑定参数
// 参数,占位符,参数
namespace t4 {
    // 一个简单的函数,接受两个整数参数并返回它们的和  
    int add(int a, int b, int c) {
        return a + b + c;
    }
    void test() {
        cout << "----------------------------------------------\n";
        // 使用 std::bind 绑定 add 函数的第一个参数为 5  
        // std::placeholders::_1 表示一个占位符
        auto bound_add_five = std::bind(add, 5, std::placeholders::_1, 7);

        // 现在 bound_add_five 是一个新的可调用对象,它接受一个整数参数  
        // 并返回该整数与 5 的和  
        int result = bound_add_five(3); // 这相当于调用 add(5, 3)  
        std::cout << "Result: " << result << std::endl; // 输出: Result: 8  
    }
}

2.5 我在已经有值的位置,输入了,是使用预定义的参数,还是我目前的
2.5.1 代码
//我在已经有值的位置,输入了,是使用预定义的参数,还是我目前的
//结果:使用预定义的数据,即使std::bind生成的函数不报错,也没有用
namespace t5 {
    // 一个简单的函数,接受两个整数参数并返回它们的和  
    int add(int a, int b, int c) {
        return a + b + c;
    }
    void test() {
        
        // 使用 std::bind 绑定 add 函数的第一个参数为 5  
        // std::placeholders::_1 表示一个占位符
        auto bound_add_five = std::bind(add, 5, std::placeholders::_1, 7);

        // 现在 bound_add_five 是一个新的可调用对象,它接受一个整数参数  
        // 并返回该整数与 5 的和  
        // 这是即使输入了9也不会有用,因为只有一个占位符需要天才
        int result = bound_add_five(3,9); // 这相当于调用 add(5, 3)  
        std::cout << "Result: " << result << std::endl; // 输出: Result: 8  
    }
}
2.5.2 运行结果
Result: 15 = 5(占位)+3+7(占位)

3.代码

#include <iostream>  
#include <functional> // 包含 std::bind 的头文件  
using namespace std;namespace t1 {// 一个简单的函数,接受两个整数参数并返回它们的和  int add(int a, int b) {return a + b;}void test() {cout << "----------------------------------------------\n";// 你也可以绑定多个参数  auto bound_add_ten_fifteen = std::bind(add, 10, 15);int another_result = bound_add_ten_fifteen(); // 这相当于调用 add(10, 15)  std::cout << "Another Result: " << another_result << std::endl; // 输出: Another Result: 25  }
}/// <summary>
/// std::placeholders::_1 是 C++11 引入的占位符,用于 std::bind 表达式中,
/// 以指示哪些参数将在稍后调用绑定后的函数对象时被提供。
/// 这些占位符用于替换被绑定的函数或可调用对象的某些参数。
/// </summary>
namespace t2 {// 一个简单的函数,接受两个整数参数并返回它们的和  int add(int a, int b) {return a + b;}void test() {cout << "----------------------------------------------\n";// 使用 std::bind 绑定 add 函数的第一个参数为 5  // std::placeholders::_1 表示一个占位符auto bound_add_five = std::bind(add, 5, std::placeholders::_1);// 现在 bound_add_five 是一个新的可调用对象,它接受一个整数参数  // 并返回该整数与 5 的和  int result = bound_add_five(3); // 这相当于调用 add(5, 3)  std::cout << "Result: " << result << std::endl; // 输出: Result: 8  }
}//尝试多个占位符
namespace t3 {// 一个简单的函数,接受两个整数参数并返回它们的和  int add(int a, int b,int c) {return a + b+c;}void test() {cout << "----------------------------------------------\n";// 使用 std::bind 绑定 add 函数的第一个参数为 5 // std::placeholders::_0 表示一个占位符 类似于数据的[0] // std::placeholders::_1 表示一个占位符 类似于数据的[1]// std::placeholders::_2 表示一个占位符 类似于数据的[2]auto bound_add_five = std::bind(add, 5, std::placeholders::_1, std::placeholders::_2);// 现在 bound_add_five 是一个新的可调用对象,它接受一个整数参数  // 并返回该整数与 5 的和  int result = bound_add_five(3,4); // 这相当于调用 add(5, 3)  std::cout << "Result: " << result << std::endl; // 输出: Result: 8  }
}//尝试交叉绑定参数
// 参数,占位符,参数
namespace t4 {// 一个简单的函数,接受两个整数参数并返回它们的和  int add(int a, int b, int c) {return a + b + c;}void test() {cout << "----------------------------------------------\n";// 使用 std::bind 绑定 add 函数的第一个参数为 5  // std::placeholders::_1 表示一个占位符auto bound_add_five = std::bind(add, 5, std::placeholders::_1, 7);// 现在 bound_add_five 是一个新的可调用对象,它接受一个整数参数  // 并返回该整数与 5 的和  int result = bound_add_five(3); // 这相当于调用 add(5, 3)  std::cout << "Result: " << result << std::endl; // 输出: Result: 8  }
}//我在已经有值的位置,输入了,是使用预定义的参数,还是我目前的
//结果:使用预定义的数据,即使std::bind生成的函数不报错,也没有用
namespace t5 {// 一个简单的函数,接受两个整数参数并返回它们的和  int add(int a, int b, int c) {return a + b + c;}void test() {cout << "----------------------------------------------\n";// 使用 std::bind 绑定 add 函数的第一个参数为 5  // std::placeholders::_1 表示一个占位符auto bound_add_five = std::bind(add, 5, std::placeholders::_1, 7);// 现在 bound_add_five 是一个新的可调用对象,它接受一个整数参数  // 并返回该整数与 5 的和  // 这是即使输入了9也不会有用,因为只有一个占位符需要天才int result = bound_add_five(3,9); // 这相当于调用 add(5, 3)  std::cout << "Result: " << result << std::endl; // 输出: Result: 8  }
}int main() {t1::test();t2::test();t3::test();t4::test();t5::test();return 0;
}

4.运行结果

----------------------------------------------
Another Result: 25
----------------------------------------------
Result: 8
----------------------------------------------
Result: 12
----------------------------------------------
Result: 15
----------------------------------------------
Result: 15

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/3555.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

操作系统安全:Linux安全审计,Linux日志详解

「作者简介」&#xff1a;2022年北京冬奥会网络安全中国代表队&#xff0c;CSDN Top100&#xff0c;就职奇安信多年&#xff0c;以实战工作为基础对安全知识体系进行总结与归纳&#xff0c;著作适用于快速入门的 《网络安全自学教程》&#xff0c;内容涵盖系统安全、信息收集等…

区块链技术与应用学习笔记(10-11节)——北大肖臻课程

目录 10.分岔 ①什么是分叉&#xff1f; ②导致分叉的原因&#xff1f; ③在比特币新共识规则发布会会导致什么分叉&#xff1f; 什么是硬分叉&#xff1f; 硬分叉例子&#xff1f; 什么是软分叉&#xff1f; 软分叉和硬分叉区别&#xff1f; 软分叉实例 11.问答 转…

【从后端日志文件中过滤出sql语句】

从后端日志文件中过滤出sql语句 why?思路日志文件的格式 结果 why? 为什么会有这种需求&#xff1f;&#xff0c;mysql数据不小心被删了完全可以从备份数据恢复&#xff0c;或者从binlog中恢复&#xff0c;但是如果前面这两种方法没办法处理&#xff08;没有备份数据库文件、…

科技云报道:走入商业化拐点,大模型“开箱即用”或突破行业困局

科技云报道原创。 大模型加速狂飙&#xff0c;AI商业化却陷入重重困境。 一方面&#xff0c;传统企业不知道怎么将AI融入原始业务&#xff0c;另一方面&#xff0c;AI企业难以找到合适的商业化路径。 纵观海外AI玩家&#xff0c;已经有许多企业趟出了自己的商业化道路。 微…

59、回溯-括号生成

思路&#xff1a; 括号是成对出现&#xff0c;首先左括号可以放n个&#xff0c;右括号也可以放n个。如果当前左括号放了3了&#xff0c;右括号放了4个&#xff0c;错了&#xff0c;如果左括号放了5个&#xff0c;右括号放了4个。可以&#xff0c;继续放右括号即可。所以可以设…

数据结构概念

一、介绍 数据结构是计算机科学中的一个核心概念&#xff0c;它涉及到如何在计算机中有效地组织、存储和管理数据&#xff0c;以支持各种算法和应用程序的高效运行。 数据结构不仅是数据元素&#xff08;如整数、字符串、对象等&#xff09;的集合&#xff0c;更关键的是这些…

贪吃蛇项目实践!(上)

大家好&#xff0c;今天我带着大家从0构建起贪吃蛇项目的高楼大厦~ 要实现这个游戏&#xff0c;我们需要实现哪些功能呢&#xff1f; 实现基本的功能&#xff1a; • 贪吃蛇地图绘制 • 蛇吃⻝物的功能&#xff08;上、下、左、右⽅向键控制蛇的动作&#xff09; • 蛇撞墙死…

matlab保存示波器数据

再重新运行一下示波器 然后就可以在工作区看见&#xff08;这里没有运行所以没有&#xff09; 将保存到文件夹中方便后续绘图

华为云FunctionGraph构建高可用系统的实践

导语 每年&#xff0c;网上都会报道XXX系统异常不可用&#xff0c;给客户带来巨大的经济损失。云服务的客户基数更大&#xff0c;一旦出现问题&#xff0c;都将给客户和服务自身带来极大影响。本文将基于华为云FunctionGraph自身的实践&#xff0c;详细介绍如何构建高可用的Se…

权威认证!瀚高股份IvorySQL通过强制性国标GB18030-2022最高级别认证

近日&#xff0c;GB 18030-2022《信息技术 中文编码字符集》应用推广大会暨“汉字守护计划”成果发布会在京召开。瀚高股份开源关系型数据库IvorySQL通过 GB 18030-2022《信息技术 中文编码字符集》强制性国家标准测试&#xff0c;达到最高实现级别&#xff08;3级&#xff09;…

基于springboot实现海滨学院班级回忆录的设计项目【项目源码+论文说明】计算机毕业设计

基于springboot实现海滨学院班级回忆录的设计演示 摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了海滨学院班级回忆录的开发全过程。通过分析海滨学院班级回忆录管理的不足&#xff0c;创建了一个计算机管理海…

【Pytorch】(十五)模型部署:ONNX和ONNX Runtime

文章目录 &#xff08;十五&#xff09;模型部署&#xff1a;ONNX和ONNX RuntimeONNX 和 ONNX Runtime的关系将PyTorch模型导出为ONNX格式使用Netron可视化ONNX模型图检查ONNX模型验证ONNX Runtime推理结果使用ONNX Runtime运行超分模型 &#xff08;十五&#xff09;模型部署&…

第十五届蓝桥杯省赛第二场C/C++B组D题【前缀总分】题解(AC)

暴力解法 O ( 26 n 5 ) O(26n^5) O(26n5) 枚举将第 i i i 个字符串的第 j j j 个字符改为 c c c 的所有方案&#xff0c;时间复杂度 O ( 26 n 2 ) O(26n^2) O(26n2)&#xff0c;修改并计算总分&#xff0c; O ( n 3 ) O(n^3) O(n3)。 暴力优化 O ( 26 n 3 log ⁡ n ) O…

基于Python实现心脏病数据可视化DEA+预测【500010103.1】

一、数据说明 该心脏病数据集是通过组合 5 个已经独立可用但以前未合并的流行心脏病数据集来策划的。在这个数据集中&#xff0c;5 个心脏数据集结合了 11 个共同特征&#xff0c;使其成为迄今为止可用于研究目的的最大心脏病数据集。 该数据集由 1190 个实例和 11 个特征组成…

《第二行代码》第二版学习笔记(6)——内容提供器

文章目录 一 运行时权限2.权限分类3 运行时申请权限 二、内容提供器1、 ContentResolver的基本用法2、现有的内容提供器3、创建自己的内容提供器2.1 创建内容提供器的步骤2.2 跨程序数据共享 内容提供器&#xff08;Content Provider&#xff09;主要用于在不同的应用程序之间实…

Python | Leetcode Python题解之第52题N皇后II

题目&#xff1a; 题解&#xff1a; class Solution:def totalNQueens(self, n: int) -> int:def backtrack(row: int) -> int:if row n:return 1else:count 0for i in range(n):if i in columns or row - i in diagonal1 or row i in diagonal2:continuecolumns.add…

【VsCode】使用VsCode学习VUE+TS必备插件

目录标题 《Auto Close Tag》&#x1f495;《Auto Rename Tag》&#x1f495;《Path Intellisense》《Open in Browser》&#x1f495;《IntelliCode》《Vue-Official》&#x1f495;《Prettier - Code formatter》&#x1f495;《ESLint》&#x1f495; 《Auto Close Tag》&am…

Docker镜像的创建 和 Dockerfile

一. Docker 镜像的创建 创建镜像有三种方法&#xff0c;分别为基于已有镜像创建、基于本地模板创建以及基于 Dockerfile 创建。 1 基于现有镜像创建 &#xff08;1&#xff09;首先启动一个镜像&#xff0c;在容器里做修改docker run -it --name web3 centos:7 /bin/bash …

maven修改默认编码格式为UTF-8

执行mvn -version查看maven版本信息发现&#xff0c;maven使用的编码格式为GBK。 为什么想到要修改编码格式呢&#xff1f;因为idea中我将文件格式统一设置为UTF-8&#xff08;如果不知道如何修改文件编码&#xff0c;可以参考文末&#xff09;&#xff0c;然后使用maven打包时…

Java调用tess4j完成 OCR 文字识别

1&#xff0c;新建 maven 工程 2&#xff0c;引入依赖 <dependency> <groupId>net.sourceforge.tess4j</groupId> <artifactId>tess4j</artifactId> <version>5.11.0</version> </dependency> 3…