如何将std::bind绑定对象转换为std::function<void()>类型?
修正std::bind绑定参数的用法
你的代码问题出在bind(func, arg)()这一行——这里的()会立即执行绑定后的函数,返回void,根本没法赋值给std::function<void()>类型的变量。正确的做法是去掉这个多余的括号,直接把std::bind的结果赋值给目标对象。
正确代码示例
#include <queue> #include <functional> std::queue<std::function<void()>> tasks; void add_job(std::function<void(void*)> func, void* arg) { // 直接将bind生成的无参可调用对象赋值给function<void()> std::function<void()> f = std::bind(func, arg); tasks.push(f); }
补充:用Lambda表达式替代bind(更直观)
除了std::bind,你也可以用lambda表达式实现同样的效果,代码可读性更强:
void add_job(std::function<void(void*)> func, void* arg) { std::function<void()> f = [func, arg]() { func(arg); }; tasks.push(f); }
关键说明
std::bind(func, arg)会把arg绑定到func的第一个参数位置,生成一个不需要额外传参就能调用的可调用对象,完美匹配std::function<void()>的签名。- 如果你坚持用bind,注意不要在bind结果后加
(),那会直接触发函数执行,而不是生成可调用对象存入队列。
内容的提问来源于stack exchange,提问作者Torch
相关产品推荐
相关产品推荐

