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 小时前
C++游戏开发(2)
开发语言·前端·c++
程序员编程指南5 小时前
Qt 嵌入式界面优化技术
c语言·开发语言·c++·qt
逝雪Yuki6 小时前
数据结构与算法——字典(前缀)树的实现
数据结构·c++·字典树·前缀树·左程云
卷卷的小趴菜学编程6 小时前
Qt-----初识
开发语言·c++·qt·sdk·qt介绍
程序员编程指南7 小时前
Qt 开发 IDE 插件开发指南
c语言·c++·ide·qt·elasticsearch
利刃大大8 小时前
【在线五子棋对战】十一、整合封装服务器模块实现
运维·服务器·c++·项目·五子棋
ok0609 小时前
C++对象访问有访问权限是不是在ide里有效
开发语言·c++·ide
程序员编程指南9 小时前
Qt 开发自动化测试框架搭建
c语言·开发语言·c++·qt
三小尛9 小时前
C++赋值运算符重载
开发语言·c++
小徐不徐说9 小时前
C++ 模板与 STL 基础入门:从泛型编程到实战工具集
开发语言·数据结构·c++·qt·面试