欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 八卦 > C++11中的bind

C++11中的bind

2025/2/5 9:50:26 来源:https://blog.csdn.net/2202_75331338/article/details/145445864  浏览:    关键词:C++11中的bind

官方文档对于bind接口的概述解释:Bind function arguments

在C++11中,std::bind 是一个非常有用的工具,用于将函数、成员函数或函数对象与特定的参数绑定在一起,生成一个新的可调用对象。std::bind 可以用于部分应用函数参数、改变参数的顺序、绑定成员函数等

#include <functional> // 需要包含这个头文件auto new_callable = std::bind(callable, arg1, arg2, ..., argN);
  • callable 可以是函数、函数指针、成员函数指针、函数对象等。

  • arg1, arg2, ..., argN 是传递给 callable 的参数。这些参数可以是具体的值,也可以是占位符 std::placeholders::_1, std::placeholders::_2, 等等。

示例
1. 绑定普通函数
#include <iostream>
#include <functional>void print_sum(int a, int b) {std::cout << a + b << std::endl;
}int main() {auto f = std::bind(print_sum, 10, 20);f(); // 输出 30return 0;
}

在这个例子中,std::bindprint_sum 函数与参数 1020 绑定在一起,生成了一个新的可调用对象 f。调用 f() 时,相当于调用了 print_sum(10, 20)

2. 使用占位符
#include <iostream>
#include <functional>void print_sum(int a, int b) {std::cout << a + b << std::endl;
}int main() {using namespace std::placeholders; // 引入占位符auto f = std::bind(print_sum, _1, _2);f(10, 20); // 输出 30auto g = std::bind(print_sum, _2, _1);g(10, 20); // 输出 30,参数顺序被交换return 0;
}

在这个例子中,_1_2 是占位符,表示在调用 fg 时传递的第一个和第二个参数。

3. 绑定成员函数
#include <iostream>
#include <functional>class MyClass {
public:void print_sum(int a, int b) {std::cout << a + b << std::endl;}
};int main() {MyClass obj;auto f = std::bind(&MyClass::print_sum, &obj, 10, 20);f(); // 输出 30using namespace std::placeholders;auto g = std::bind(&MyClass::print_sum, &obj, _1, _2);g(10, 20); // 输出 30return 0;
}

在这个例子中,std::bind 绑定了 MyClass 的成员函数 print_sum,并且需要传递一个对象指针 &obj作为第一个参数。

4. 绑定函数对象
#include <iostream>
#include <functional>struct Add {int operator()(int a, int b) const {return a + b;}
};int main() {Add add;auto f = std::bind(add, 10, 20);std::cout << f() << std::endl; // 输出 30using namespace std::placeholders;auto g = std::bind(add, _1, _2);std::cout << g(10, 20) << std::endl; // 输出 30return 0;
}

在这个例子中,std::bind 绑定了一个函数对象 add,并生成了一个新的可调用对象 fg

5.线程池

基于bind的作用,当我们在设计一些线程池,或者任务池的时候,就可以将将任务池中的任务设置为函数类型,函数的参数由添加任务者直接使用bind进行适配绑定设置,而任务池中的任务被处理,只需要取出一个个的函数进行执行即可。

这样做有个好处就是,这种任务池在设计的时候,不用考虑都有哪些任务处理方式了,处理函数该如何设计,有多少个什么样的参数,这些都不用考虑了,降低了代码之间的耦合度。

#include <iostream>
#include <functional>
#include <cstring>
#include <vector>void Print(const std::string& str, int x)
{std::cout << str << "--->" << x << std::endl;
}int main()
{using task_t = std::function<void()>;std::vector<task_t> _task;_task.push_back(std::bind(Print, "wuxu", 666));_task.push_back(std::bind(Print, "cdd", 888));_task.push_back(std::bind(Print, "Mudu", 666));for(auto& f : _task)f();}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com