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;
}
相关推荐
.小墨迹1 小时前
C++学习之std::move 的用法与优缺点分析
linux·开发语言·c++·学习·算法·ubuntu
看见繁华1 小时前
C++ 设计模式&设计原则
java·c++·设计模式
点云SLAM1 小时前
C++ error C2065: “M_PI”: 未声明的标识符 解决方案
开发语言·c++·error c2065·m_pi未声明 解决方案
草莓熊Lotso2 小时前
C++11 核心精髓:类新功能、lambda与包装器实战
开发语言·c++·人工智能·经验分享·后端·nginx·asp.net
欧特克_Glodon2 小时前
C++医学图像处理经典ITK库用法详解<三>: 图像配准模块功能
c++·图像处理·vtk·图像配准
秦苒&2 小时前
【C语言指针四】数组指针变量、二维数组传参本质、函数指针变量、函数指针数组
c语言·开发语言·c++·c#
傅里叶的耶2 小时前
C++ Primer Plus(第6版):第三章 处理数据
开发语言·c++
CC.GG2 小时前
【C++】AVL树
java·开发语言·c++
CoderCodingNo2 小时前
【GESP】C++四级真题 luogu-B4416 [GESP202509 四级] 最长连续段
开发语言·c++·算法
程序员zgh3 小时前
代码重构 —— 读后感
运维·c语言·开发语言·c++·重构