首页 > 其他分享 >std::bind 详解

std::bind 详解

时间:2023-07-24 23:44:38浏览次数:37  
标签:std 函数 int bind add 详解 using

bind

bind 是C++ 的一个函数, 用来绑定其他函数,用来改造。

1. 普通函数的bind

普通函数可以被绑定,传参。

int add(int x, int y){
    cout << "int add(int, int)" << endl;
    return x+y;
}
以上有一个add普通函数,则,bind 绑定。
    
#include <functional>
using std::bind;
int main(){
    auto f = bind(&add, 5, 9);
    f(); 
    add(5,9);
}

f( ) 和 add(5,9) 是等价的。

2. 成员函数的bind

成员函数的bind 大体上类似普通函数, 但 &类内成员函数, 因此,还须生成一个 类对象。

bind(&Class, &obj, 参数...), &obj 的 & 可省略。

class Example{
	public:
		int add(int x, int y){
			return x+y;
		}
}

int main(){
    Example ex;
    auto f = bind(&Example::add, &ex, 5, 9);
    ex.add(5,9);
    f();
}

3. 占位符

bind 可以实现占位符的效果。using namespace std::placeholders
在 bind 时,不直接传参数,而是采用 _n 的占位符, 相当于改造函数。

auto f = bind(&add, _4, _2); 
//表示,调用 f 时, 至少有 4 个参数,且只有第 4 和第 2 个参数有效,作为 add 的第 1 和第 2 个形参。
f(1,2,3,4,5,6,7);
参数的数量可以 > 4, 但不能 < 所指定的占位符的最大值。

4. 传引用参数

bind 可以传递引用参数,因为bind 默认是值传递。

std::cref, std::ref 使用引用包装器。 cref 是 const reference.

int num = 5;
auto f = bind(&add, std::ref(num), num);
num = 9;
f(); 
//此时,f() == add(9,5); 

5. auto 的真面目

add 的函数类型是 int(int, int)
f 的函数类型是 int()

但是直接以 int() f = bind... 不行, 因为要用一个函数容器来包含。

using std::function

using std::function;
function<int()> f = bind(&add, 5, 9);
auto f = bind(&add, 5, 9);
// auto 就是 function<int()>
// f的类型是 int(),所以 function <int()> 
// 如果是 占位符的话, 则就是有参数的。int(int,int) 了。
function<int(int, int)> f = bind(&add, _1, _3);

6. bind 成员变量

bind 返回的是一个函数,成员变量以函数的返回值形式返回。

所以f 的函数类型是 int( )

class Example{
	public:
		int data;
}

Example ex;
function<int()> f = bind(&Example::data, &ex);

总结:

bind 可以让函数或成员变量改造成其他形式的函数。(函数返回类型不变)

附代码:

/*
 *
 * Copyright (C) 2023-07-23 23:29 zxinlog <[email protected]>
 *
 */

#include <functional>
#include <iostream>

using std::bind;
using std::cout;
using std::endl;
using std::function;
using namespace std::placeholders;

int add(int x, int y) {
    cout << "int add(int x, int y)" << endl;
    return x + y;
}

class Example {
public:
    int add(int x, int y) {
        cout << "int Example::add(int, int)" << endl;
        return x + y;
    }
    int data = 300;
};

void test0() {
    function<int()> f = bind(&add, 1, 2);
    cout << "f() =  " << f() << endl;

    function<int(int, int, int, int)> f2 = bind(&add, _1, _4);
    cout << "f2() = " << f2(1, 3, 4, 8) << endl;

    Example ex;
    function<int()> f3 = bind(&Example::add, &ex, 5, 9);
    cout << "f3() = " << f3() << endl;

    function<int()> f4 = bind(&Example::data, &ex);
    cout << "f4() = " << f4() << endl;
}

int main(int argc, char* argv[]) {
    test0();
    return 0;
}

标签:std,函数,int,bind,add,详解,using
From: https://www.cnblogs.com/zxinlog/p/17578656.html

相关文章

  • FTP命令详解
    http://www.chinaunix.net/jh/15/81780.html[精华]FTP命令详解作者:haizhz0928FTP命令详解 --------------------------------------------------------------------------------  FTP命令是Internet用户使用最频繁的命令之一,不论是在DOS还是UNIX操 作系统下使......
  • EL表达式详解
    EL表达式详解在JSP页面中,使用标签库代替传统的Java片段语言来实现页面的显示逻辑已经不是新技术了,然而,由自定义标签很容易造成重复定义和非标准的实现。鉴于此,出现了JSTL(JSPStandardTagLibrary)。大多数JSP页面逻辑提供了实现的JSTL技术,该技术本身就是一个标签库。Sun......
  • linux下载安装fastdfs和fastdfs与nginx整合、springboot访问fastdfs
    文章目录需求分析分布式文件系统1FastDFS安装FastDFS和nginx整合2.整合java访问fastdfs服务文件上传查询下载测试整合springboot需求分析搭建fastDFS文件服务器1)安装fastDFStracker和storage2)在storageserver上安装nginx在storageserver上安装nginx的目的是对外通过http访问......
  • 实例详解 EJB 中的六大事务传播属性
    前言事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。在关系数据库中,一个事务可以是一条或一组SQL语句,甚至整个程序。它有通常被称为ACID的原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持续性(Durability)四大特性:原子性(Atomicity):......
  • Linux系统特殊权限详解
    一、Linux系统特殊权限概述在Linux系统中,普通权限我们了解到有r(读)、w(写)、x(执行),这三种权限,但是在我们查看一些其它的文件时,会发现还会有其它权限的字母。例如:s,t等比如下面查看的这三个文件的权限,在不同用户权限上面有不同的字母。 二、suid1、在介绍这个权限之前需要了解一些......
  • 网页性能管理详解
    你遇到过性能很差的网页吗?这种网页响应非常缓慢,占用大量的CPU和内存,浏览起来常常有卡顿,页面的动画效果也不流畅。网页性能管理详解你会有什么反应?我猜想,大多数用户会关闭这个页面,改为访问其他网站。作为一个开发者,肯定不愿意看到这种情况,那么怎样才能提高性能呢?本文将详细介绍......
  • DB2存储过程-基础详解
    DB2存储过程-基础详解关键字:存储过程  您将:学习SQLPL的基本要素。理解如何声明变量、条件和处理程序。学习控制流语句。学习游标处理和如何返回结果集。理解错误处理机制。  Sql代码.-,-----------------. V......
  • RPA界面元素定位与操控技术详解-达观数据
    RPA入门介绍什么是RPA?RPA是机器人流程自动化RoboticProcessAutomation的简写。在《智能RPA实战》中,我们这样定义:通过特定的、可模拟人类在计算机界面上进行操作的技术,按照规则自动执行相应的流程任务,代替或辅助人类完成相关的计算机操作。一句话总结就是:用软件机器人自动化......
  • 第六章 注解式控制器详解 SpringMVC强大的数据绑定(2)
    6.6.2、@RequestParam绑定单个请求参数值@RequestParam用于将请求参数区数据映射到功能处理方法的参数上。1.publicStringrequestparam1(@RequestParam请求中包含username参数(如/requestparam1?username=zhang),则自动传入。 此处要特别注意:右击项目,选择“属性”,打开“属性对......
  • 各类存储详解
    对象存储、NAS存储和本地存储是三种不同的存储技术,它们在设计和用途上有所不同。1.对象存储(ObjectStorage):对象存储以对象的形式存储数据,每个对象包含数据本身、元数据和唯一的标识符。对象存储通常使用分布式架构,并采用冗余备份策略来实现高可用性和容错性。对象存储适......