【问题标题】:std::bind to std::function conversion problem [duplicate]std::bind 到 std::function 转换问题[重复]
【发布时间】: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


【解决方案1】:

正如@Patrick Roberts 在 cmets 中指出的那样,当需要 driver_manager 的实例时,我试图将一个函数传递给 std::bind。解决办法是改变

driver_manager driverManager();

driver_manager driverManager;.

请参阅 [StackOverflow 回答] https://stackoverflow.com/a/9490384/11693641 了解更多详情。

【讨论】:

    猜你喜欢
    • 2022-11-04
    • 1970-01-01
    • 2019-02-20
    • 2018-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-18
    • 2013-04-16
    相关资源
    最近更新 更多