【发布时间】:2021-09-18 06:33:24
【问题描述】:
尝试使用以下代码从std::bind() 获取函数对象:
driver_manager driverManager();
std::function<void(mqtt::const_message_ptr,
mqtt::async_client*,callback*,sql::Driver*)> fn = std::bind(&driver_manager::test_callback, &driverManager, std::placeholders::_1,
std::placeholders::_2, std::placeholders::_3, std::placeholders::_4);
导致错误:
错误:从 'std::_Bind_helper
, mqtt::async_client*, callback*, sql::Driver*) 转换, driver_manager (*)(), const std::_Placeholder&, const std::_Placeholder&, const std::_Placeholder&, const std::_Placeholder&>:: type' 到非标量类型 'std::function , mqtt::async_client*, callback*, sql::Driver*)>' 请求
几个小时以来我一直试图找出问题所在,这段代码有什么问题?
编辑
driver_manager.hpp
class driver_manager{
public:
driver_manager();
void test_callback(mqtt::const_message_ptr, mqtt::async_client*,callback*,sql::Driver*);
};
driver_manager.cpp
driver_manager::driver_manager(){
}
void driver_manager::test_callback(mqtt::const_message_ptr msg, mqtt::async_client *client, callback *cb, sql::Driver *driver){
std::cout << "Callback triggered" << std::endl;
}
【问题讨论】:
-
有什么理由使用
bind代替 lambda 函数? -
我们能看到各种类型的确切名称,尤其是
driver_manager::test_callback吗? -
不相关:您可以通过在行前添加
using namespace std::placeholders;来缩短代码(请保留在其所在的方法中) -
@SergeyA 我必须使用来自不同类的回调。
-
您必须将指向
driver_manager实例的指针作为第二个参数传递给std::bind()。你不能只传递一个返回一个的函数。
标签: c++ std-function stdbind