使用boost :: function和/或boost :: bind可以简化/改进以下函数指针传递吗?
void PassPtr(int (*pt2Func)(float, std::string, std::string))
{
int result = (*pt2Func)(12, "a", "b"); // call using function pointer
cout << result << endl;
}
// execute example code
void Pass_A_Function_Pointer()
{
PassPtr(&DoIt);
}
Run Code Online (Sandbox Code Playgroud) 我目前正从C#转到C++并重写一些游戏引擎代码,我想我在tr1的墙上; 基本上我想要做的是让输入层从触摸屏获取输入,然后触发回调以通知任何听取该输入的元素.现在tr1/boost似乎通过使用函数和绑定使这变得非常容易,但是激活void()的回调没有问题,但是现在我试图在调用时将参数发送到这些回调(例如枚举) .
这里的问题是,当我调用bind并插入参数时,它不会充当占位符,而是充当要传递的永久值.例如我的代码在这里:
包含类:
tr1::function<void (MenuActions action)> callback;
callback = tr1::bind(&MenuScene::handleInputCallback, this, MenuActions::neutral);
m_menuUILayer->registerCallback(callback);
Run Code Online (Sandbox Code Playgroud)
我的目的是创建一个函数并绑定它,然后registerCallback将此回调传递给成员类并存储引用.这部分有效,但现在在成员类中我可以调用回调但是总是发送默认参数...
会员类:
if (m_callback)
{
m_callback(MenuActions::backgroundTouchDown);
}
Run Code Online (Sandbox Code Playgroud)
因此,在这里,而不是将MenuActions :: backgroundTouchDown发送到回调中的主包含类,仍然使用默认的MenuActions :: neutral.我想知道我是否遗漏了一些东西,或者我的睡眠不足只是让我走错了路?多谢你们!
将a boost::function作为参数传递给另一个函数(回调)时,此函数的签名可能会变得很长.
示例:
考虑一下boost::function:
boost::function<MyClass * (
TypeA param1,
TypeB param2,
TypeC param3,
TypeD param4,
TypeE param5,
TypeF param6)> CreateMyClass;
Run Code Online (Sandbox Code Playgroud)
现在,如果我们将它boost::function作为函数参数传递,使用它的函数的签名变得非常冗长且难以阅读:
void myFunctionUsingTheCallack(boost::function<MyClass * (
TypeA param1,
TypeB param2,
TypeC param3,
TypeD param4,
TypeE param5,
TypeF param6)> the_callback);
Run Code Online (Sandbox Code Playgroud)
我在这里错过了什么吗?是否有任何缩短签名的技巧myFunctionWithTheCallack?
首先是免责声明,我正在替换一堆使用boost :: function和boost :: bind的代码.但是,我正在转向不允许rtti的代码库.我想继续使用提升,但不知道是否有办法解决这个限制.
所以,我试图模仿它的一些功能,但更简化.我有一个Callback类:
template <class Class, typename ReturnType = void> class Callback0 {
typedef ReturnType (Class::*Method)();
public:
Callback0(Class* object, Method method)
: m_object(object)
, m_method(method)
{
;
}
Callback0(const Callback0& callback)
: m_object(callback.m_object)
, m_method(callback.m_method)
{
;
}
operator bool() {
return m_object != 0;
}
operator bool() const {
return m_object != 0;
}
ReturnType operator()() {
return (m_object->*m_method)();
}
Callback0<Class, ReturnType>& operator=(const Callback0<Class, ReturnType>& callback) {
if(this != &callback) {
m_object = callback.m_object;
m_method = …Run Code Online (Sandbox Code Playgroud) 假设我有以下代码:
int f(int, int);
int main()
{
SomeFunc(boost::bind(f, 1, 2));
}
Run Code Online (Sandbox Code Playgroud)
从SomeFunc()函数,是否可以访问绑定类型持有的参数?像这样的东西(伪代码):
// Obvious syntax issues...
void SomeFunc(boost::bind& functor)
{
if(functor.function == &f)
{
if(functor.argument1 == 1)
DoSomething();
}
}
Run Code Online (Sandbox Code Playgroud)
我可以从boost :: bind类型中提取这些信息吗?
下面的代码成功地向给定端点发送异步消息.
// message is a boost::shared_ptr<std::string>
// open a UDP socket
boost::asio::ip::udp::socket socket(ioService);
socket.open(boost::asio::ip::udp::v4());
// create the remote endpoint
boost::asio::ip::udp::endpoint remoteEndpoint(boost::asio::ip::address_v4::from_string(address), port);
// asynchronously send a datagram to the remote endpoint
socket.async_send_to(boost::asio::buffer(*message),
remoteEndpoint,
boost::bind(&MyClass::handler,
this,
message,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
socket.close();
Run Code Online (Sandbox Code Playgroud)
但是,如果我将类型更改message为a std::shared_ptr<std::string>而不是a boost::shared_ptr<std::string>则调用async_send_to不会编译.
错误是:
boost/boost/bind/bind.hpp:457:9: No matching function for call to object of type 'boost::_mfi::mf3<void, MyClass, const boost::shared_ptr<std::__1::basic_string<char> > &, const boost::system::error_code &, unsigned long>'.
Run Code Online (Sandbox Code Playgroud)
有人可以解释什么是错的吗?可能是因为我正在使用boost :: bind吗?
boost-bind ×6
c++ ×6
boost ×4
callback ×2
bind ×1
boost-asio ×1
c++11 ×1
c++98 ×1
functor ×1
shared-ptr ×1
tr1 ×1