C++基础std::bind

目录

说明

举例子:


说明

std::bind是一个函数模板,用于创建一个可调用对象,该对象可以在稍后的时候被调用。bind的作用是将函数与参数绑定在一起,在调用时可以自动传入预定的参数值。

std::bind的基本语法如下:

template< class F, class... Args> /unspecified/ bind( F&& f, Args&&... args );

其中,F是需要绑定的函数或函数对象,Args是绑定函数所需的参数。

所以说可以认为bind是函数特殊引用

举例子:

cpp 复制代码
void f(int& n1, int& n2, const int& n3)
{
	std::cout << "In function: " << n1 << ' ' << n2 << ' ' << n3 << '\n';
	++n1; // 增加存储于函数对象的 n1 副本
	++n2; // 增加 main() 的 n2
	// ++n3; // 编译错误
}

    int n1 = 1, n2 = 2, n3 = 3;
	std::function<void()> bound_f = std::bind(f, n1, std::ref(n2), std::cref(n3));
	n1 = 10;
	n2 = 11;
	n3 = 12;
	std::cout << "Before function: " << n1 << ' ' << n2 << ' ' << n3 << '\n';
	bound_f();
	std::cout << "After function: " << n1 << ' ' << n2 << ' ' << n3 << '\n';

输出如下,std::refstd::cref 是 C++ 标准库中的两个实用工具,它们分别用于创建对对象的引用和常量引用的包装器

上面例子还可以改成下面,我们根据情况分布绑定

cpp 复制代码
// using namespace std::placeholders;

auto bound_f = std::bind(f, _1, _2, std::cref(n3));
// _1是placeholders占位参数,可以之后传递 
bound_f(n1, n2);

例子2

当然也可以 绑定lambda表达式、成员函数之类,与上面例子出入不大,这里举个stl的用例

cpp 复制代码
void printValue(int& value) {
    std::cout << "Value: " << value << std::endl;
}

int main() {
    int x = 10;
    std::vector<std::function<void()>> funcs;

    // 使用 std::ref 包装 x 的引用,并将其存储在 funcs 中
    funcs.emplace_back(std::bind(printValue, std::ref(x)));

    // 调用函数,输出 "Value: 10"
    funcs[0]();

    return 0;
}
相关推荐
小欣加油3 小时前
leetcode1926 迷宫中离入口最近的出口
数据结构·c++·算法·leetcode·职场和发展
星恒随风4 小时前
C++ 类和对象入门(五):初始化列表、explicit 和 static 成员详解
开发语言·c++·笔记·学习·状态模式
浪客灿心5 小时前
项目篇:模块设计与实现
数据库·c++
牛油果子哥q5 小时前
【C++ STL vector】C++ STL vector 终极精讲:动态数组底层原理、两倍扩容机制、迭代器失效、增删查改、性能剖析与工程避坑指南
开发语言·c++
为何创造硅基生物7 小时前
独占指针的创建std::make_unique 本身自带堆出现
c++
kyle~7 小时前
ROS 2 与 Isaac Sim 联合仿真(一)体系架构、环境选型与基础通信闭环
c++·机器人·nvidia·仿真·ros2
努力努力再努力wz7 小时前
【内存管理与高并发内存池系列】从 mmap 到 malloc:文件映射、匿名映射与 glibc 内存分配机制详解
linux·c语言·数据结构·数据库·c++·qt·链表
八解毒剂8 小时前
数据结构-平衡二叉树——对二叉搜索树的优化
数据结构·c++·算法
起床困难户5758 小时前
条款20:协助完成返回值优化
c++
啦啦啦啦啦zzzz8 小时前
算法总结(二分查找、双指针)
c++·算法