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::ref 和 std::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;
}
相关推荐
黎相思2 小时前
LRU Cache
c++·缓存
UIU1142 小时前
P1003 [NOIP 2011 提高组] 铺地毯
数据结构·c++·算法
xxwl5853 小时前
区域赛算法模版第四章---数据结构
数据结构·c++·算法
余额瞒着我当琳5 小时前
哈希表底层原理解析,直接定址法,哈希冲突,负载因子,哈希函数,开放定址法
java·c++·哈希算法·散列表
xxwl5855 小时前
区域赛算法模版第五章---数学与数论
c++·笔记·算法
局部有解6 小时前
LeetCode Hot100 438 找到字符串中所有字母异位词
c++·算法·leetcode
David猪大卫6 小时前
【C++修炼】string类:string类的模拟实现
c语言·开发语言·数据结构·c++·经验分享·笔记·学习
WL学习笔记7 小时前
模板初阶(C++)
开发语言·c++·后端·模板初阶
埃伊蟹黄面8 小时前
面试常问题目 —— STL
c++·面试·职场和发展·stl
CHANG_THE_WORLD8 小时前
ida-multi-mcp-跨版本逆向实战博客
c++