std::bind 未绑定到库 `typedef` ed 函数

std::bind not binding to a library `typedef` ed function

我正在尝试将 std::bind 与具有 typedef 功能的库一起使用。

#include <iostream>
#include <string>
#include <functional>

typedef void (*GDBusReturnFunction) (void* user_data);

class Test
{
   void reply(void* user_data)
   {
      std::cout << "Hello" << std::endl;
      return;
   }

   void test_reply()
   {
      auto reply_func = std::bind(&Test::reply, this, std::placeholders::_1);
      call(reply_func);
   }

   void call(GDBusReturnFunction func)
   {}
};

int main()
{
   Test();
}

这是我遇到的编译错误

prog.cc:19:11: error: cannot convert 'std::_Bind<void (Test::*(Test*, std::_Placeholder<1>))(void*)>' to 'GDBusReturnFunction' {aka 'void (*)(void*)'}
   19 |      call(reply_func);
      |           ^~~~~~~~~~
      |           |
      |           std::_Bind<void (Test::*(Test*, std::_Placeholder<1>))(void*)>
prog.cc:22:33: note:   initializing argument 1 of 'void Test::call(GDBusReturnFunction)'
   22 |   void call(GDBusReturnFunction func)
      |             ~~~~~~~~~~~~~~~~~~~~^~~~

当我将方法切换到 static 并且不使用 std::bind 时,一切正常。


我也试过这个

     call(&reply_func);

但是那个returns同样的错误

我错过了什么?

std::bindreturns一个未指定类型(即未指定类型的函数对象),

template< class F, class... Args >
/*unspecified*/ bind( F&& f, Args&&... args );
//^^^^^^^^^^^^

无法复制到函数指针类型。

您需要使用

不过,std::bind 可以替换为 lambda function

[this](auto user_data) { this->reply(user_data); }

使用模板化 Test::call 函数的示例解决方案可能看起来像。 See a demo

#include <iostream>
#include <string>

class Test
{
public:
   // optionally you could make it also template function!
   // e.g.
   // template<typename Type>
   // void reply(Type* user_data)
   void reply(void* user_data)
   {
      std::cout << "Hello" << std::endl;
   }

   void test_reply()
   {
      call([this](auto user_data) { this->reply(user_data); });
   }

   template<typename Callable>
   void call(Callable func) const
   {
      int userData = 1; // some user data
      func(&userData);
   }
};