我正在围绕websocket++库做一个消息库。这个库允许我设置自己的函数来管理消息。因为我不是在做将使用我的代码的最终应用程序,所以我还需要允许我的用户为这个处理程序设置他们想要的函数。
这就是它现在的工作方式。在某个地方有一个socket(m_client)类,它有一个set_handler函数,它的用法类似于下面的代码片段。
m_client.set_message_handler(bind(&myFunction,&m_client,_1,_2));我想要做的是提供一个函数,它将作为参数&myFunction,所以用户只需调用如下代码:
my_class.set_msg_handler(&myFunction);然后这将是一个声明:
void set_msg_handler(<type> myfunction){
m_client.set_message_handler(bind(myFunction,&m_client,_1,_2));
}但我不能明确哪个是myfunction的正确类型,以便让它进行编译。或者这是否是一个很好的归档方法。我看了下boost代码看看能不能得到一些提示...但是当它结束与模板的工作时,这是我还没有管理的东西。
我知道让用户自己进行绑定并传递其输出会更简单,但m_client不能直接访问,我希望在封装建议时保持这种方式。我想现在这并不是绝对必要的,也许有一天我也会需要它。因此,在学习的提议中,我决定以任何方式问它。
对于这种级别的用法,我在C++上还是个新手,整个函数指针、处理程序和模板在我的实际理解中略显逊色。我读过关于bind用法的文章,但是所有的例子都是关于声明一个函数,然后直接使用bind。
我也搜索了一个类似的问题,但没有找到它,如果它存在。我不会放弃我的方法不是最好的或完全错误的,所以欢迎所有的建议和建议。
发布于 2013-06-25 19:26:20
好了,我终于让它像我期望的那样工作了。解决方案非常简单,只是一个关于我在c++中的经验的问题。
首先,在将要执行最后绑定的类的头部,我声明了一个类型,该类型声明了一个函数指针,该指针具有message_handler必须具有的结构。在oder类中定义包装器方法将很容易:
typedef void (*msg_handler_ptr)(client*,connection_hdl,message_ptr);我花了很长时间才得到正确的声明。完成后,我已经在相应的类中声明了将执行绑定的函数:
void set_msg_handler(msg_handler_ptr myfunction){
using websocketpp::lib::placeholders::_1;
using websocketpp::lib::placeholders::_2;
using websocketpp::lib::bind;
m_client.set_message_handler(bind(myfunction,&m_client,::_1,::_2));
} 在我的控制器类上的最后一个包装器:
#include "mysocket_class.h"
void mycontroller::set_msg_handler(msg_handler_ptr myfunction)
{
c.set_msg_handler(myfunction);
}在我想要的任何地方,我声明我的真实msg_handler非常简单,它只会将它接收到的内容发送到标准输出:
void on_message(client* c, websocketpp::connection_hdl hdl, message_ptr msg)
{
client::connection_ptr con = c->get_con_from_hdl(hdl);
std::cout << "Recived " << msg->get_payload() << std::endl;
}
int main(int argc, char* argv[]) {
mycontroller c();
c.set_msg_handler(&on_message);
}这就是你将一个函数作为另一个函数的参数传递的方式。我的应用程序运行起来了。
感谢大家的提示!
发布于 2013-06-21 20:01:35
boost正在使用模板,也许你应该尝试一下,比如
template <typename T>
void set_msg_handler(T myfunction){
m_client.set_message_handler(bind(myFunction,&m_client,_1,_2));
}但是如果你想强迫用户给出某种函数,你可以检查模板的专门化。
但是bind几乎可以接受任何类型的指针。
https://stackoverflow.com/questions/17234541
复制相似问题