【C++ STL】bind适配器详解

std::bind适配器的详解

std::bind 是 C++11 引入的函数适配器,位于头文件 <functional> 中。它可以将可调用对象(函数、函数指针、成员函数、函数对象等)与其部分参数绑定,生成一个新的可调用对象,这个新对象可以存储并在后续调用。它是传统 bind1st/bind2nd 的现代替代品,功能更强大且使用更灵活。

  • 基本语法
    • 可调用对象:可以是普通函数、函数指针、成员函数指针、函数对象(仿函数)等。
    • 参数 :可以指定具体的值,也可以用占位符(std::placeholders::_1, _2, ...)表示"将来调用时提供的参数"。
    • 返回一个新的可调用对象,其类型为 std::bind 返回的未指定类型(通常用 auto 或 std::function 保存)。
    • 占位符 定义在 std::placeholders 命名空间中,_1 代表调用新对象时的第一个实参,_2 代表第二个,依此类推。
c++ 复制代码
#include <functional>
auto bound_func = std::bind(可调用对象, 参数1, 参数2, ..., 参数N);

!注意 占位符的数量,必须等于"新函数对象需要接收的参数个数",否则会编译错误。

绑定普通函数

c++ 复制代码
using namespace std::placeholders;

// 1、绑定所有参数,生成一个无参可调用对象
auto bound_fun1 = bind(add, 100, 200);

int res = bound_fun1();		// 100 + 200 = 300

// 2、绑定部分参数
// // 第一个参数由调用时提供,第二个固定为100
auto bound_fun2 = bind(add, _1, 100);
res = bound_fun2(200);		// 200 + 100 = 300

// 交换参数顺序
auto bond_fun3 = bind(add, _2, _1);
bond_fun3(100, 200);	// 200 + 100 = 300

绑定仿函数

c++ 复制代码
template<typename T>
struct Multiply {
	T operator()(T a, T b) {
		return a * b;
	}
};

int main()
{
	using namespace std::placeholders;

	vector<int> v = { 1, 2, 3, 4 };
	
	// 两种绑定方式都可以
	// Multiply<int> mult;
	// auto bound_fun = bind(mult, _1, 10);
	auto bound_fun = bind(Multiply<int>(), _1, 10);

	for (int i : v) {
		cout << bound_fun(i) << endl;	// 10 20 30 40
	}

	return EXIT_SUCCESS;
};

绑定类成员函数

绑定类成员函数时,需注意:第一个参数必须是"类对象的地址"(&对象)或"类指针",后续参数为成员函数的参数(固定值/占位符)。

c++ 复制代码
class Person {
public:
	void printName(string name, int age)
	{
		cout << "name = " << name << ",age = " << age << endl;
	}
};

int main()
{
	using namespace std::placeholders;

	Person p;
	// 第一个参数&p是类对象的指针
	auto bound_fun1 = bind(&Person::printName, &p, _1, 25);
	bound_fun1("张三");	// name = 张三,age = 25

	return EXIT_SUCCESS;
};

使用注意事项

  • 必须包含头文件functional,否则会出现编译错误;
  • 占位符的使用:占位符的数量必须与"新函数对象需要接收的参数个数"一致;占位符的序号(_1、_2)必须与新函数调用时的参数顺序对应;
  • 绑定类成员函数的注意点:必须传入类对象的地址(&对象)或类指针,否则无法调用成员函数;绑定const成员函数时,对象地址也需是const类型(若对象是const);
  • bind返回的函数对象类型复杂,建议用auto接收,避免手动写类型;
相关推荐
codigger2 天前
Java 26 深度解析:一次“性能兑现 + 契约收紧”的版本
java·后端·编程·编程语言
Helix2506 天前
2026编程入门指南:零基础如何科学选择第一门编程语言?
java·c语言·javascript·零基础·编程语言·python入门·编程就业
Helix2506 天前
Python与其他编程语言优劣势对比:2026初学者选型指南
java·python·教程·编程语言·入门·初学者编程选型
狼爷6 天前
Rust/Go/Java/Python/PHP 大比拼:负载下后端框架到底差多少?
java·后端·编程语言
天若有情6737 天前
开源|Comfort Lang v1.0.1,一款主打清爽交互的新型命令式编程语言
python·开源·交互·编程语言·项目分享·repl·comfort lang
被摘下的星星8 天前
编程de强语言和弱语言
编程语言
codigger9 天前
Git 三区域模型:把 add、commit、reset、merge 一次讲透
git·github·编程·编程语言
Sammyyyyy11 天前
结构化决策模型 Jev 实战笔记,3 个原语、4 个限制、5 个落地场景
人工智能·笔记·开发工具·编程语言
武雄(小星Ai)15 天前
Opus 5.5 降价40%、GPT-6 API腰斩:2026年9月AI编程模型选购指南(附成本计算器)
人工智能·ai·编程语言