std::bind和std::function可灵活适配C++函数,支持延迟调用、参数绑定和函数存储,适用于回调、事件处理及多线程任务传递,结合lambda可构建高效事件系统。

使用
bind
function
std::bind
std::function
std::bind
std::function
立即学习“C++免费学习笔记(深入)”;
std::bind
#include <iostream>
#include <functional>
void print_sum(int a, int b) {
std::cout << "Sum: " << a + b << std::endl;
}
int main() {
// 绑定第一个参数为 10
auto print_sum_10 = std::bind(print_sum, 10, std::placeholders::_1);
print_sum_10(5); // 输出:Sum: 15
// 绑定所有参数
auto print_sum_10_20 = std::bind(print_sum, 10, 20);
print_sum_10_20(); // 输出:Sum: 30
return 0;
}在这个例子中,
std::placeholders::_1
print_sum_10
std::function
#include <iostream>
#include <functional>
int add(int a, int b) {
return a + b;
}
int main() {
std::function<int(int, int)> func = add;
std::cout << "Result: " << func(5, 3) << std::endl; // 输出:Result: 8
// 使用 lambda 表达式
std::function<int(int)> square = [](int x) { return x * x; };
std::cout << "Square: " << square(4) << std::endl; // 输出:Square: 16
return 0;
}这里,
std::function<int(int, int)>
int
int
bind
function
在多线程编程中,
std::bind
std::function
线程安全问题:
示例:
本文档主要讲述的是OpenMP并行程序设计;OpenMP是一个编译器指令和库函数的集合,主要是为共享式存储计算机上的并行程序设计使用的。目前支持OpenMP的语言主要有Fortran,C/C++。 OpenMP在并行执行程序时,采用的是fork/join式并行模式,共享存储式并行程序就是使用fork/join式并行的。希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看
0
#include <iostream>
#include <functional>
#include <thread>
#include <mutex>
std::mutex mtx;
void print_message(const std::string& msg) {
std::lock_guard<std::mutex> lock(mtx); // 保护 std::cout
std::cout << "Thread: " << msg << std::endl;
}
int main() {
std::string message = "Hello from thread!";
// 传递 message 的拷贝,避免生命周期问题
std::thread t(std::bind(print_message, message));
t.join();
return 0;
}在这个例子中,
std::lock_guard
std::cout
message
std::bind
message
bind
std::bind
区别:
std::bind
std::bind
std::bind
适用场景:
std::bind
std::bind
示例:
#include <iostream>
#include <functional>
class MyClass {
public:
void print_value(int value) {
std::cout << "Value: " << value << std::endl;
}
};
int main() {
MyClass obj;
// 使用 std::bind 绑定成员函数
auto print_value_bind = std::bind(&MyClass::print_value, &obj, std::placeholders::_1);
print_value_bind(10); // 输出:Value: 10
// 使用 lambda 表达式绑定成员函数
auto print_value_lambda = [&obj](int value) { obj.print_value(value); };
print_value_lambda(20); // 输出:Value: 20
return 0;
}在这个例子中,
std::bind
print_value
obj
std::bind
obj
如何使用
bind
function
std::bind
std::function
实现步骤:
std::function
std::map
示例:
#include <iostream>
#include <functional>
#include <map>
#include <vector>
// 事件类型
enum class EventType {
BUTTON_CLICKED,
MOUSE_MOVED
};
// 事件处理函数类型
using EventHandler = std::function<void(void)>;
class EventManager {
public:
// 注册事件处理函数
void register_handler(EventType event_type, EventHandler handler) {
handlers[event_type].push_back(handler);
}
// 触发事件
void trigger_event(EventType event_type) {
for (const auto& handler : handlers[event_type]) {
handler();
}
}
private:
std::map<EventType, std::vector<EventHandler>> handlers;
};
int main() {
EventManager event_manager;
// 注册按钮点击事件处理函数
event_manager.register_handler(EventType::BUTTON_CLICKED, []() {
std::cout << "Button clicked!" << std::endl;
});
// 注册鼠标移动事件处理函数
event_manager.register_handler(EventType::MOUSE_MOVED, []() {
std::cout << "Mouse moved!" << std::endl;
});
// 触发按钮点击事件
event_manager.trigger_event(EventType::BUTTON_CLICKED); // 输出:Button clicked!
// 触发鼠标移动事件
event_manager.trigger_event(EventType::MOUSE_MOVED); // 输出:Mouse moved!
return 0;
}在这个例子中,
EventManager
register_handler
trigger_event
std::map
以上就是C++函数适配器 bind和function使用的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号