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::bind
returns一个未指定类型(即未指定类型的函数对象),
template< class F, class... Args >
/*unspecified*/ bind( F&& f, Args&&... args );
//^^^^^^^^^^^^
无法复制到函数指针类型。
您需要使用
std::function
或
- 一个模板化的
call
函数。
不过,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);
}
};
我正在尝试将 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::bind
returns一个未指定类型(即未指定类型的函数对象),
template< class F, class... Args >
/*unspecified*/ bind( F&& f, Args&&... args );
//^^^^^^^^^^^^
无法复制到函数指针类型。
您需要使用
std::function
或- 一个模板化的
call
函数。
不过,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);
}
};